Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android recyclerView findViewHolderForAdapterPosition returns null

I want to click an item in recyclerView programmatically, I found a way do that:

recyclerView.findViewHolderForAdapterPosition(0).itemView.performClick(); 

but it doesn't work for me, the findViewHolderForAdapterPosition just returns null.

Did I miss something in my code?

HistoryListAdapter:

public class HistoryListAdapter extends RecyclerView.Adapter<HistoryListAdapter.ViewHolder> { private static ArrayList<RecordItem> recordItems; private static FragmentActivity activity; private static RecordList recordList;  public HistoryListAdapter(ArrayList<RecordItem> recordItems, FragmentActivity FA, RecordList FRL) {     this.recordItems = recordItems;     this.activity = FA;     this.recordList = FRL; }  @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {     // create a new view     View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.recorditem, parent, false);     return new ViewHolder(itemLayoutView); }  @Override public void onBindViewHolder(final ViewHolder viewHolder, final int position) {     // TextView setText ... }  // Return the size of the itemsData (invoked by the layout manager) @Override public int getItemCount() {     return recordItems.size(); }  // inner class to hold a reference to each item of RecyclerView public static class ViewHolder extends RecyclerView.ViewHolder{     public TextView result, datetime;      public ViewHolder(View itemLayoutView) {         super(itemLayoutView);         itemLayoutView.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View v) {                 if (activity != null) {                     // do something...                 }             }         });         result = (TextView) itemLayoutView.findViewById(R.id.result);         heartrate = (TextView) itemLayoutView.findViewById(R.id.heartrate);         datetime = (TextView) itemLayoutView.findViewById(R.id.datetime);     } } } 

RecordList:

RecyclerView listView = (RecyclerView) layoutView.findViewById(R.id.listView); HistoryListAdapter listadapter = new HistoryListAdapter(itemsToShow, getActivity(), RecordList.this); listView.swapAdapter(listadapter, false); listView.findViewHolderForAdapterPosition(0).itemView.performClick(); 

I omitted some code, But it should not affect the overall structure of my code.

like image 345
Aaron Tsai Avatar asked Sep 29 '15 06:09

Aaron Tsai


2 Answers

According to the official documentation:

if notifyDataSetChanged() has been called but the new layout has not been calculated yet, this method will return null since the new positions of views are unknown until the layout is calculated.

It's not safe to use findViewHolderForAdapterPosition().

While you call this method after listView.swapAdapter(listadapter, false); you'll always get a null as result because notifyDataSetChanged() will be called.

like image 163
Rami Avatar answered Sep 20 '22 01:09

Rami


you can do this:

   listView.postDelayed(new Runnable()             {                 @Override                 public void run()                 {                     if(listView.findViewHolderForAdapterPosition(0)!=null )                     {                          listView.findViewHolderForAdapterPosition(0).itemView.performClick();                     }                 }             },50); 
like image 45
Dharmaraj Avatar answered Sep 19 '22 01:09

Dharmaraj