【问题标题】:Getting Wrong position of RecyclerView Item in next Fragment after applying SearchFilter and OnClick on RecyclerView Item在 RecyclerView 项目上应用 SearchFilter 和 OnClick 后,RecyclerView 项目在下一个片段中的位置错误
【发布时间】:2018-04-09 11:09:53
【问题描述】:

我在 Fragment 上设置了 RecyclerView。我已经为 RecyclerView Adapter 中的 RecyclerView 项目设置了 OnClick 侦听器。我使用 SearchFilter 获得过滤项目。在点击 RecyclerView 项目后,我需要获取项目位置并传入捆绑到下一个片段。但过滤项目后我的位置错误。这是设置 Recyclerview 适配器的代码

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

这是我的 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);
        }

过滤后如何获取RecyclerView item的正确位置?

【问题讨论】:

  • 你能告诉我们你的视图持有者代码吗?
  • 我已经添加了我的 ViewHolder 代码
  • 显然位置没有意义......你应该使用一些id

标签: android android-fragments android-recyclerview android-cardview android-search


【解决方案1】:

使用对象索引从originalList 查找位置,我已更新代码

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();
                    }
                });

传递位置没用 尝试直接传递对象或id

【讨论】:

  • 它正在工作...搜索后我应该如何在卡片上显示卡片位置?
  • @Satya你能详细解释一下吗?,recyclerview项目中要显示在哪里?
  • 假设我在 Recyclerview 中有 10 个项目。我搜索编号为 10 的最后一个项目。所以搜索后它出现在 recyclerview 的顶部,但它只显示为 1。相反,我想在 recyclerview 中显示它的位置?
  • 您想为该项目显示 10?表示原始位置?
  • 同样的逻辑,originalList.indexOf(filterList.get(position))返回原位
猜你喜欢
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多