在RecyclerView中分段ClickListener错误

时间:2018-06-12 12:05:23

标签: android android-fragments android-recyclerview

我已将RecyclerView从Activity转换为Fragment所有工作但当我点击项目时我有这个错误:

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;

此代码为片段:

SELECT distinct l.LaborName, l.EstimatedHours, l.TotalCost,
       l.TotalCharge, w.CurrencySymbol,
       SUM(l.TotalCost) over (partition by l.LaborName, w.CurrencySymbol) AS totalCost,
       SUM(l.TotalCharge) over (partition by l.LaborName, w.CurrencySymbol) AS totalCharge,
       SUM(l.EstimatedHours) over (partition by l.LaborName, w.CurrencySymbol) AS totalHours
FROM WOLabor l INNER JOIN 
     WO w
     ON l.WOPK = w.WOPK
WHERE l.WOPK = 10100 AND RecordType = 1;

3 个答案:

答案 0 :(得分:2)

你没有打电话

public void setOnItemClickListener(MyClickListener myClickListener) {
        this.myClickListener = myClickListener;
    }

来自任何地方。

从适配器或片段调用此方法。或者,如果您现在不想要,只需添加 null check

@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.
        }
    });

答案 1 :(得分:0)

在您的recyclerview上调用set adapter之前调用setOnItemClickListener

答案 2 :(得分:0)

我已经解决了:

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