繁体   English   中英

单击过滤的 RecyclerView 项时显示错误数据

[英]Showing wrong data when filtered RecyclerView item is clicked

我的 android 应用中有一个带有搜索栏的RecyclerView 当我在其中搜索并单击一个项目时,它显示错误的数据。

我知道它为什么会发生,但我不知道如何解决它。 我已经尝试了很多东西,但仍然有问题。

这是我的适配器的代码。

RecyclerView.Adapter<hisAdapter.hisViewHolder> {
    private ArrayList<hisItem> mhislist;
    public onItemClickListener mListener;

    public  interface onItemClickListener {
        void onItemClick(int position);
    }

    public void  setOnitemClickLIstener(onItemClickListener lIstener) {
        mListener = lIstener;
    }

    public class hisViewHolder extends RecyclerView.ViewHolder {
        public TextView mTextView1;
        public TextView mTextView2;
        public TextView card_num;

        public hisViewHolder(View itemView) {
            super(itemView);
            mTextView1 = itemView.findViewById(R.id.textView1);
            mTextView2 = itemView.findViewById(R.id.textView2);
            card_num = itemView.findViewById(R.id.number);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                   if (mListener != null) {
                       int position = getAdapterPosition();
                       if (position != RecyclerView.NO_POSITION){
                           mListener.onItemClick(position);
                       }
                    }
                }
            });
        }
    }

    public hisAdapter(ArrayList<hisItem> hisList){
         mhislist = hisList;
    }

    @Override
    public hisViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
      View v = 
      LayoutInflater.from(parent.getContext()).inflate(R.layout.his_item, parent, false);
      hisViewHolder hvh = new hisViewHolder(v);

      return hvh;
    }

    @Override
    public void onBindViewHolder(hisViewHolder holder, int position) {
        hisItem currentItem = mhislist.get(position);
        holder.mTextView1.setText(currentItem.getText1());
        holder.mTextView2.setText(currentItem.getText2());
        holder.card_num.setText(currentItem.getText3());
    }

    @Override
    public int getItemCount() {
        return mhislist.size();
    }

    public void filterList(ArrayList<hisItem> filteredList){
        mhislist = filteredList;
        notifyDataSetChanged();
    }
}

这是我有一个搜索功能代码和点击处理程序的MainActivity

editTextt.addTextChangedListener(new TextWatcher() {
       @Override
       public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { }

        @Override
        public void afterTextChanged(Editable editable) {
            filter(editable.toString());
        }
    });
}

public void filter(String text) {
    ArrayList<hisItem> filteredList = new ArrayList<>();

    for (hisItem item : hisList) {
        if (item.getText1().toLowerCase().contains(text.toLowerCase())) {
            filteredList.add(item);
        }
    }

    mAdapter.filterList(filteredList);
}

@Override
public void onItemClick(int position) {
    Intent intent = new Intent(this, singleActivity.class);
    hisItem clickeditem = hisList.get(position);
    String pos = String.valueOf(position);
    intent.putExtra(CARD_NUM ,pos );
    intent.putExtra(HEAD_LINE,clickeditem.getText1());
    intent.putExtra(REAL_NUM,clickeditem.getText3());
    startActivity(intent);
}

如果我需要在问题中添加任何内容,请告诉我。 我可以提供这些。 谢谢。

您可以通过两种不同的方式解决问题。 您可能会考虑更改MainActivity的功能。 因为您在onItemClick函数中所做的事情是错误的。 当此hisList中的某些项目已被过滤掉时,您正在从hisList中获取该项目。 因此,在这种情况下,您需要从filteredList中获取项目。 这可以通过声明可以轻松实现filteredList在你的全局变量MainActivity

// Declaring the filteredList as a public variable that can be accessed from anywhere in this class.
public ArrayList<String> filteredList = new ArrayList<>();

@Override
public void onItemClick(int position) {
    Intent intent = new Intent(this, singleActivity.class);

    // Get the item from the filteredList which is the updated one.
    hisItem clickeditem = filteredList.get(position);

    String pos = String.valueOf(position);
    intent.putExtra(CARD_NUM ,pos );
    intent.putExtra(HEAD_LINE,clickeditem.getText1());
    intent.putExtra(REAL_NUM,clickeditem.getText3());
    startActivity(intent);
}

但是,第二种方法是将onClick行为集成到您的适配器中。 我更喜欢这个,因为这很简单,而且不容易出错。 它将始终处理传递给适配器的列表。 所以没有其他头痛。

itemView.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View view) {
        int position = getAdapterPosition();

        Intent intent = new Intent(context, singleActivity.class);
        hisItem clickeditem = mhislist.get(position);
        String pos = String.valueOf(position);
        intent.putExtra("CARD_NUMBER", pos);
        intent.putExtra("HEAD_LINE", clickeditem.getText1());
        intent.putExtra("REAL_NUMBER", clickeditem.getText3());
        startActivity(intent);
    }
});

希望有帮助。

使用此代码绝对可以解决您的问题!!

private ArrayList<Employee> filteredList = new ArrayList<Employee>();
    private void filter(String text) {
      filteredList.clear();
      for (Employee item : mEmployeeList) {
        if (item.getVehicle_number().toLowerCase().contains(text.toLowerCase())) {
          filteredList.add(item);
        }
      }
      myadapter.filterList(filteredList);
    }
    
    @Override
    public void onItemClick(int position) {
      Intent ediIntent = new Intent(this, Edit_Activity.class);
      if(filteredList.size() > 0) {
        Employee clickedItem = filteredList.get(position);
       } else {
          Employee clickedItem = mEmployeeList.get(position);
       }
      ...
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM