Search code examples
androidandroid-fragmentsandroid-recyclerviewandroid-cardviewandroid-search

Getting Wrong position of RecyclerView Item in next Fragment after applying SearchFilter and OnClick on RecyclerView Item


I have set RecyclerView on Fragment.I have set OnClick listener for RecyclerView item from RecyclerView Adapter.I get Filtered item using SearchFilter.After onClick of RecyclerView Item I need to get the Item Position and pass in Bundles to Next Fragment.But I am getting wrong position after filtering item.This is code for setting Recyclerview Adapter

public class StatusAdapter extends RecyclerView.Adapter<StatusAdapter.ViewHolder> {
    private ArrayList<CurrentEntry> originalList,filterList;
    Context context;

    public void filter(String newText)
    {
        filterList.clear();
        if(TextUtils.isEmpty(newText))
        {
            filterList.addAll(originalList);
        }
        else
        {
            for(CurrentStatusEntry entry:originalList)
            {
                if(entry.getName().toLowerCase().contains(newText))
                    filterList.add(entry);
            }
            notifyDataSetChanged();
        }
        //    notifyDataSetChanged();
    }
    public StatusAdapter(ArrayList<CurrentEntry> originalList,Context context)
    {
        this.originalList=originalList;
        this.context=context;
        this.filterList=new ArrayList<CurrentEntry>();
        this.filterList.addAll(this.originalList);
    }
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.current_status_card,parent,false);
        return new ViewHolder(v);
    }


     @Override
        public void onBindViewHolder(final ViewHolder holder, int position) {
            final  CurrentEntry current=filterList.get(position);
            int temppos=holder.getAdapterPosition();
            int finalPos=temppos+1;
            holder.Name.setText(current.getName());
            holder.People.setText(current.getNo());
            holder.Estimate.setText(current.getEsti());
            holder.bookTime.setText(current.getTime());
            holder.myNumber.setText(String.valueOf(finalPos));
            holder.lapsedTime.setText(current.getLapsedTime());
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position=holder.getAdapterPosition();
            Bundle bundle=new Bundle();
            bundle.putInt("position",position);
            StatusInfo satusInfo=new StatusInfo();
            satusInfo.setArguments(bundle);
            AppCompatActivity activity=(AppCompatActivity)v.getContext();
            activity.getSupportFragmentManager().beginTransaction().add(R.id.frame,satusInfo).addToBackStack("info").commit();
                }
            });
        } 

@Override
public int getItemCount() {
    return (null!=filterList ? filterList.size():0);
}  

This is code for my ViewHolder

public class ViewHolder extends RecyclerView.ViewHolder {
      private   TextView Name ;
     private    TextView People;
   private      TextView Estimate;
   private      TextView myNumber;
    private     TextView bookTime;
    private     TextView lapsedTime;
        private  ViewHolder(View itemView) {
            super(itemView);
            Name=(TextView)itemView.findViewById(R.id.name);
            People=(TextView)itemView.findViewById(R.id.people);
            Estimate=(TextView)itemView.findViewById(R.id.estimate);
            myNumber=(TextView)itemView.findViewById(R.id.no);
            bookTime=(TextView)itemView.findViewById(R.id.bookTime);
            lapsedTime=(TextView)itemView.findViewById(R.id.lapsedTime);
        }

How to get correct position of RecyclerView item after filtering ?


Solution

  • Find position from originalList using object index,i have updated the code

    holder.itemView.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            int position=holder.getAdapterPosition();
                    Bundle bundle=new Bundle();
    
                   // change
                    bundle.putInt("position",  originalList.indexOf(filterList.get(position)));
    
                    StatusInfo satusInfo=new StatusInfo();
                    satusInfo.setArguments(bundle);
                    AppCompatActivity activity=(AppCompatActivity)v.getContext();
                    activity.getSupportFragmentManager().beginTransaction().add(R.id.frame,satusInfo).addToBackStack("info").commit();
                        }
                    });
    

    Passing position is Useless try to pass direct object or id