Satyam Gondhale
Satyam Gondhale

Reputation: 1457

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 ?

Upvotes: 0

Views: 1045

Answers (1)

MJM
MJM

Reputation: 5301

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

Upvotes: 3

Related Questions