代码之家  ›  专栏  ›  技术社区  ›  Marcus J.Kennedy

RecyclerView中的片段ClickListener错误

  •  -1
  • Marcus J.Kennedy  · 技术社区  · 8 年前

    我已将RecyclerView从活动转换为碎片化所有工作,但当我单击项时,出现以下错误:

    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;
    
    3 回复  |  直到 8 年前
        1
  •  2
  •   Pankaj Kumar    8 年前

    你不是在打电话

    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.
            }
        });
    
        2
  •  0
  •   Duna    8 年前

    在对RecyclerView调用setOnEmClickListener之前

        3
  •  0
  •   Marcus J.Kennedy    8 年前

    我已经解决了:

    ((MyRecyclerViewAdapter) mAdapter).setOnItemClickListener(new MyRecyclerViewAdapter
                    .MyClickListener() {
                @Override
                public void onItemClick(int position, View v) {              
                    Log.wtf("TEST", position);
                }
            });
    
    推荐文章