RecyclerView 选中某项
时间: 2023-08-27 13:05:41 浏览: 44
要在 RecyclerView 中选中某项,可以使用 RecyclerView 的 Adapter 中的 ViewHolder 的 setSelected() 方法来设置 ViewHolder 的选中状态,然后在 RecyclerView 的 ItemDecoration 中监听点击事件,并根据点击的位置设置 ViewHolder 的选中状态。
具体实现步骤如下:
1. 在 ViewHolder 中添加一个选中状态的变量 selected,用来记录当前 ViewHolder 是否被选中。
2. 在 ViewHolder 中实现 setSelected() 方法,用来设置 ViewHolder 的选中状态。
3. 在 RecyclerView 的 Adapter 中实现一个 setSelectedPosition() 方法,用来设置选中的位置,并通知 RecyclerView 更新选中状态。
4. 在 RecyclerView 的 ItemDecoration 中监听点击事件,获取点击的位置,并根据位置设置 ViewHolder 的选中状态。
5. 在 RecyclerView 的 Adapter 中重写 getItemViewType() 方法,并根据 ViewHolder 的选中状态返回不同的布局类型,以便在布局中区分选中和未选中状态。
下面是一个简单的示例代码:
```
public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {
private List<MyData> mDataList;
private int mSelectedPosition = -1; // 默认没有选中任何项
public void setSelectedPosition(int position) {
mSelectedPosition = position;
notifyDataSetChanged();
}
@Override
public int getItemViewType(int position) {
if (position == mSelectedPosition) {
return R.layout.item_selected;
} else {
return R.layout.item_normal;
}
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
MyData data = mDataList.get(position);
holder.setSelected(position == mSelectedPosition);
holder.bind(data);
}
}
public class MyItemDecoration extends RecyclerView.ItemDecoration {
private MyAdapter mAdapter;
public MyItemDecoration(MyAdapter adapter) {
mAdapter = adapter;
}
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDrawOver(c, parent, state);
// 监听点击事件并设置选中状态
parent.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
View child = rv.findChildViewUnder(e.getX(), e.getY());
if (child != null) {
int position = rv.getChildAdapterPosition(child);
mAdapter.setSelectedPosition(position);
return true;
}
return false;
}
});
}
}
public class MyViewHolder extends RecyclerView.ViewHolder {
private TextView mTextView;
private boolean mSelected;
public MyViewHolder(View itemView) {
super(itemView);
mTextView = itemView.findViewById(R.id.text_view);
}
public void setSelected(boolean selected) {
mSelected = selected;
itemView.setSelected(selected);
}
public void bind(MyData data) {
mTextView.setText(data.getText());
}
}
```
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)