android - RecyclerView中的片段ClickListener错误
问题描述
我已将 RecyclerView 从 Activity 转换为 Fragment 所有工作,但是当我单击项目时出现此错误:
java.lang.NullPointerException: Attempt to invoke interface method 'void fragment.MyRecyclerViewAdapter$MyClickListener.onItemClick(int, android.view.View)' on a null object reference
这个错误在myClickListener.onItemClick(getAdapterPosition(), v);
public class MyRecyclerViewAdapter extends RecyclerView
.Adapter<MyRecyclerViewAdapter
.DataObjectHolder> {
private static String LOG_TAG = "MyRecyclerViewAdapter";
private ArrayList<DataObject> mDataset;
private static MyClickListener myClickListener;
public static class DataObjectHolder extends RecyclerView.ViewHolder
implements View
.OnClickListener {
TextView label;
TextView dateTime;
public DataObjectHolder(View itemView) {
super(itemView);
label = (TextView) itemView.findViewById(R.id.textView);
dateTime = (TextView) itemView.findViewById(R.id.textView2);
Log.i(LOG_TAG, "Adding Listener");
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
myClickListener.onItemClick(getAdapterPosition(), v); //ERROR HERE
}
}
public void setOnItemClickListener(MyClickListener myClickListener) {
this.myClickListener = myClickListener;
}
public MyRecyclerViewAdapter(ArrayList<DataObject> myDataset) {
mDataset = myDataset;
}
@Override
public DataObjectHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.card_view_row, parent, false);
DataObjectHolder dataObjectHolder = new DataObjectHolder(view);
return dataObjectHolder;
}
@Override
public void onBindViewHolder(DataObjectHolder holder, int position) {
holder.label.setText(mDataset.get(position).getmText1());
holder.dateTime.setText(mDataset.get(position).getmText2());
}
public void addItem(DataObject dataObj, int index) {
mDataset.add(index, dataObj);
notifyItemInserted(index);
}
public void deleteItem(int index) {
mDataset.remove(index);
notifyItemRemoved(index);
}
@Override
public int getItemCount() {
return mDataset.size();
}
public interface MyClickListener {
public void onItemClick(int position, View v);
}
}
此代码在片段中:
mView = inflater.inflate(R.layout.fragment_two, container, false);
mRecyclerView = (RecyclerView) mView.findViewById(R.id.my_recycler_view);
mRecyclerView.setHasFixedSize(false);
mLayoutManager = new LinearLayoutManager(getContext());
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter = new MyRecyclerViewAdapter(getDataSet());
mRecyclerView.setAdapter(mAdapter);
return mView;
解决方案
你没有打电话
public void setOnItemClickListener(MyClickListener myClickListener) {
this.myClickListener = myClickListener;
}
从任何地方。
从您的适配器或片段中调用此方法。或者,如果您现在不想要,只需添加空检查
@Override
public void onClick(View v) {
if (myClickListener!= null) {
myClickListener.onItemClick(getAdapterPosition(), v); //ERROR HERE
}
}
并将以下代码添加到 Fragment 类中。
((MyRecyclerViewAdapter) mAdapter).setOnItemClickListener(new MyRecyclerViewAdapter.MyClickListener() {
@Override
public void onItemClick(int position, View v) {
// Implement your logic to do after clicking on any item.
}
});
推荐阅读
- html - 如何在加载字体之前使用内联元素设置字体图标的大小
- node.js - 如何弄清楚 node.js 代码是如何运行的?
- drupal - 链接图像并添加资产
- php - 迁移到 PHP 7 后出现不一致的 Memcached PHP 会话读取错误
- php - phpword removeblock - 表仍然存在
- facebook - 在 Facebook 上分享页面而不打开图表
- sql - 如何在 2 个差异表之间进行联合
- flutter - Flutter:如何更改 Appbar 文本的字体?
- wcf - 在 wcf 中将对象作为参数传递时获取空对象
- presto - 强制 athena/presto 尊重来自 S3 的文件排序