java - RecyclerView 带过滤器列表的可点击对象

标签 java android android-recyclerview

我对 Android 编程还比较陌生。我有一个 RecycleView ,其中有 CardView ,按行排列。单击任何行都会打开与该行关联的新 Activity 。一切都运行良好,直到我将过滤器功能添加到此列表中。当我搜索列表然后单击一项时,它不会打开与筛选结果关联的 Activity 。它会打开与原始列表中该位置的项目相关的 Activity 。

示例 - 原始列表:AA、BA、CC、DA、ED、FF

搜索:“A”过滤结果:AA、BA、DA

但是当我单击项目 DA 时,它会打开 CC Activity 。我已在适配器上调用了 notifyDataSetChanged()

我搜索并发现了类似的问题,但无法在我的代码中实现。

这是代码:

     public class MainActivity extends AppCompatActivity implements ExampleAdapter.OnItemClickListener{
     public static final String EXTRA_IMG = "imageresource";
     public static final String EXTRA_TXT1 = "text1";
     public static final String EXTRA_TXT2 = "text2";
     public static final String EXTRA_TXT3 = "text3";

     private ArrayList<ExampleItem> mExampleList;
     private RecyclerView mRecyclerView;
     private ExampleAdapter mAdapter;
     private RecyclerView.LayoutManager mLayoutManager;


     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);

         createExampleList();
         buildRecyclerView();

         EditText editText = findViewById(R.id.editText);
         editText.addTextChangedListener(new TextWatcher() {
             @Override
             public void beforeTextChanged(CharSequence s, int start, int count, int after) {

             }

             @Override
             public void onTextChanged(CharSequence s, int start, int before, int count) {

             }

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

     }

     private void filter(String text) {
         ArrayList<ExampleItem> filteredList = new ArrayList<>();

         for (ExampleItem item : mExampleList) {
             if (item.getText1().toLowerCase().contains(text.toLowerCase())) {
                 filteredList.add(item);
             }
         }
         mAdapter.filterList(filteredList);
     }

     private void createExampleList() {
        //just creating list
     }

     private void buildRecyclerView() {
         mRecyclerView = findViewById(R.id.recyclerView);
         mRecyclerView.setHasFixedSize(true);
         mLayoutManager = new LinearLayoutManager(this);
         mAdapter = new ExampleAdapter(mExampleList);
         mRecyclerView.setLayoutManager(mLayoutManager);
         mRecyclerView.setAdapter(mAdapter);
         mAdapter.setOnItemClickListener(MainActivity.this);
     }

     @Override
     public void onItemClick(int position) {
         Intent detailintent = new Intent(this,DetailActivity.class);
         ExampleItem clickedItem = mExampleList.get(position);
         detailintent.putExtra(EXTRA_IMG,clickedItem.getImageResource());
         detailintent.putExtra(EXTRA_TXT1,clickedItem.getText1());
         detailintent.putExtra(EXTRA_TXT2,clickedItem.getText2());
         detailintent.putExtra(EXTRA_TXT3,clickedItem.getText3());
         startActivity(detailintent);
     }
     }

     public class ExampleAdapter extends RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> {
     private ArrayList<ExampleItem> mExampleList;
     private OnItemClickListener mListener;
     public interface OnItemClickListener{
         void onItemClick(int position);
     }
     public void setOnItemClickListener(OnItemClickListener listener){
         mListener=listener;
     }

     public class ExampleViewHolder extends RecyclerView.ViewHolder {
         public ImageView mImageView;
         public TextView mTextView1;
         public TextView mTextView2;
         public TextView mTextView3;

         public ExampleViewHolder(View itemView) {
             super(itemView);
             mImageView = itemView.findViewById(R.id.imageView);
             mTextView1 = itemView.findViewById(R.id.textView);
             mTextView2 = itemView.findViewById(R.id.textView7);
             mTextView3 = itemView.findViewById(R.id.textView2);
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(mListener != null ){
                        int position = getAdapterPosition();
                        if(position != RecyclerView.NO_POSITION){
                            mListener.onItemClick(position);
                        }
                    }
                }
            });
         }
     }

     public ExampleAdapter(ArrayList<ExampleItem> exampleList) {
         mExampleList = exampleList;
     }

     @Override
     public ExampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
         View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.example_item,
            parent, false);
         ExampleViewHolder evh = new ExampleViewHolder(v);
         return evh;
     }

     @Override
     public void onBindViewHolder(ExampleViewHolder holder, int position) {
         ExampleItem currentItem = mExampleList.get(position);

         holder.mImageView.setImageResource(currentItem.getImageResource());
         holder.mTextView1.setText(currentItem.getText1());
         holder.mTextView2.setText(currentItem.getText2());
         holder.mTextView3.setText(currentItem.getText3());
}

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

    public void filterList(ArrayList<ExampleItem> filteredList) {
        mExampleList = filteredList;
        notifyDataSetChanged();
    }
}

最佳答案

您有两个列表,一个在您的 Activity 中,另一个在您的适配器中。

过滤列表后,您只需通知适配器并将适配器 mExampleList 设置为新的过滤列表。 Activity 列表保持不变。

当您单击某个项目时,您可以让 Activity 处理单击事件。但该 Activity 仍然具有旧的、未过滤的列表,因此它会将错误的数据发送到您的新 Activity 。

解决方案:只需在过滤方法中的 mAdapter.filterList(filteredList); 行旁边添加 mExampleList = FilteredList

关于java - RecyclerView 带过滤器列表的可点击对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50133036/

相关文章:

java - picasso + RxJava2 : Method call should happen from the main thread

java - 如何使用 JUnit 5 测试 Kafka 消息消费者的 PACT

android - react native : set different variable in iOS/Android builds

java - RecyclerView 单击两次

java - 是什么导致 RecyclerView 中的滚动性能不佳?

java - 更改 ListView 的背景颜色项,同时保持自定义 Drawable 的效果

java - 带有 Java 和 ReactJS 服务器端渲染的微服务 UI 前端

android - ListView 中的 ArrayIndexOutOfBounds 异常

android - 如何从 href =""在移动设备上打开 facebook native 应用程序

android - 使用 LinearSnapHelper 在 recyclerview 中捕捉第一个和最后一个项目的问题