首先,你问在哪里放置onClickListener - 你应该将其放置在onBindViewHolder中。你也可以像下面这样在你的项目的ViewHolder类中附加一个onClickListener:
public class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
}
}
针对实现单选行为,这里提供的答案是有效的,但如果你有很多项并且每次都重新绑定所有视图,调用onNotifyDatasetChanged会影响性能。
denvercoder9提供的链接是一个好的教程,可以帮助理解如何设置RecyclerView,但我认为它使单选行为变得复杂。我将全面回答并提供所有必要的内容来使其正常工作。以下是我如何实现单选行为的方法:
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
final YourItemViewHolder itemViewHolder = (YourItemViewHolder) holder;
itemViewHolder.getItemSelectionIndicator()
.setSelected(position == mSelectedPosition);
itemViewHolder.getItemWrapperView()
.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(mLogTag, "Tapped on " + position);
notifyItemChanged(mSelectedPosition);
itemViewHolder.getItemSelectionIndicator().setSelected(true);
mSelectedPosition = position;
notifyItemChanged(position);
}
});
getItemSelectionIndicator()
和getItemWrapperView()
是ViewHolder中的方法,它们从item布局返回特定的视图。ItemWrapperView可以是包装整个项的顶部Linear/RelativeLayout。在其上设置点击监听器将确保如果用户在项目视图中的任何地方轻击,则单击有效。
ItemSelectionIndicator可以是已设置状态列表可绘制背景的Linear或RelativeLayout。这意味着当它被设置为选定时,它会自动显示一个形状绘制以指示选择。当它被设置为未选定时,绘制将自动删除。这就是指示器视图的外观:
<RelativeLayout
android:id="@+id/selection_indicator"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/selection_indicator_state_list"/>
这是位于res/drawable中的selection_indicator_state_list.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true"
android:drawable="@drawable/item_selection_shape"/>
<item android:state_selected="false"
android:drawable="@color/transparent"/>
</selector>
这是res/drawable中的item_selection_shape.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
//22 is value of transparency, BDBDBD is the color
<solid android:color="#22BDBDBD"/>
<stroke android:width="2dp" android:color="@color/md_blue_600"/>
<corners
android:radius="3dp"/>
</shape>