如何在RecyclerView中实现带equals判断的Item点击事件?
问题:RecyclerView实现基于Item内容判断的点击逻辑
之前ListView性能不足,我切换为RecyclerView,现已在MainActivity中实现RecyclerView的Item点击功能,需要实现类似ListView的逻辑:通过equals判断点击项的内容,为不同内容的Item执行对应自定义操作(如点击Dog播放指定音频)。
我的RecyclerView适配器代码
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ViewHolder> { private List<String> mData; private LayoutInflater mInflater; private ItemClickListener mClickListener; // data is passed into the constructor MyRecyclerViewAdapter(Context context, List<String> data) { this.mInflater = LayoutInflater.from(context); this.mData = data; } // inflates the row layout from xml when needed @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = mInflater.inflate(R.layout.adapter_box, parent, false); return new ViewHolder(view); } // binds the data to the TextView in each row @Override public void onBindViewHolder(ViewHolder holder, int position) { String animal = mData.get(position); holder.myTextView.setText(animal); } // total number of rows @Override public int getItemCount() { return mData.size(); } // stores and recycles views as they are scrolled off screen public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { TextView myTextView; ViewHolder(View itemView) { super(itemView); myTextView = itemView.findViewById(R.id.text_adapter); itemView.setOnClickListener(this); } @Override public void onClick(View view) { if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition()); } } // convenience method for getting data at click position String getItem(int id) { return mData.get(id); } // allows clicks events to be caught void setClickListener(ItemClickListener itemClickListener) { this.mClickListener = itemClickListener; } // parent activity will implement this method to respond to click events public interface ItemClickListener { void onItemClick(View view, int position); } }
此前ListView的实现方式
ListView listView = findViewById(R.id.testL); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { if (parent.getItemAtPosition(position).equals("hello")) { TextView details = word_dialog.findViewById(R.id.word_edit_desc); details.setText("hello"); } } });
需要实现逻辑的RecyclerView点击方法
@Override public void onItemClick(View view, int position) { }
MainActivity相关代码
ArrayList<String> animalNames = new ArrayList<>(); animalNames.add("Dog"); animalNames.add("Cow"); animalNames.add("Camel"); animalNames.add("Sheep"); animalNames.add("Goat"); // set up the RecyclerView recyclerView = findViewById(R.id.myList); recyclerView.setLayoutManager(new LinearLayoutManager(this)); adapter = new MyRecyclerViewAdapter(this, animalNames); adapter.setClickListener(this); recyclerView.setAdapter(adapter); if (somecode.equals("Dog")){ soundPlay(MediaPlayer.create(getBaseContext(), R.raw.star)); } if (somecode.equals("Camel")){ soundPlay(MediaPlayer.create(getBaseContext(), R.raw.tick)); }
解决方案
直接在onItemClick方法中,通过适配器的getItem方法获取点击位置的内容,再进行判断执行对应操作,完整实现如下:
@Override public void onItemClick(View view, int position) { // 获取当前点击项的内容 String clickedAnimal = adapter.getItem(position); // 根据内容执行对应自定义操作 if ("Dog".equals(clickedAnimal)) { soundPlay(MediaPlayer.create(getBaseContext(), R.raw.star)); } else if ("Camel".equals(clickedAnimal)) { soundPlay(MediaPlayer.create(getBaseContext(), R.raw.tick)); } // 可继续添加其他动物的判断逻辑 }
注意事项
- 使用
"常量".equals(变量)的写法,能避免变量为null时抛出NullPointerException - 借助适配器提供的
getItem方法获取数据,符合代码封装原则,也无需重复操作数据源列表
内容的提问来源于stack exchange,提问作者SuperMen
相关产品推荐
相关产品推荐

