处理RecyclerView的条目点击和多选

这个图片选择界面使用了support v7里的一个控件RecyclerView并且做了多选功能。



<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:padding="1dp">

<ImageView android:id="@+id/adapter_image_imageview"

android:contentDescription="@null"

android:layout_width="match_parent"

android:layout_height=" match_parent"

android:scaleType="centerCrop"/>

<CheckBox android:id="@+id/adapter_image_checkbox"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:background="#80000000"

android:maxLines="1"

android:ellipsize="end"/>
</RelativeLayout>

图的右边是Item Layout,在一个ReletiveLayout里用ImageView显示图片,底部叠了一层半透的CheckBox用来显示图片Title和选择图片。多选的思路是在Item的显示数据里(Model)添加一个是否选择的信息,在Item视图里(View)添加相应的处理。


Adapter的显示数据

static class ItemData {

int id;

String type;

String title;
boolean selected;

ItemData(int id, String type, String title, boolean selected) {

this.id = id;
this.type = type;
this.title = title;
this.selected = selected;

}
}


onBindViewHolder里根据Item的selected数据设置CheckBox。设置点击侦听,CheckBox状态发生变化则更新该Item的显示数据selected值。

@Override
public void onBindViewHolder(final ItemView holder, final int position) {
ItemData data = refData.get(position);
int id = data.id;

String title = data.title;
boolean selected = data.selected;

holder.checkbox.setText(title);

holder.checkbox.setOnCheckedChangeListener(null);

holder.checkbox.setChecked(selected);

holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

@Override

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

//int position = holder.getAdapterPosition();

refData.get(position).selected = isChecked;

}
});

此时代码已经能够实现点击多选的功能。

这里有一个细节,CheckBox侦听器里使用onBindViewHolder传来的参数position时Android Studio的代码检查发出了警告如下图:

"Do not treat position as fixed; only use immediately and call holder.getAdapterPosition() to look it up later"。对于这条检查警告的的原因,我查阅了RecycleView.Adapter的文档。


适配器方法public void onBindViewHolder(AdapterImageAsync.ItemView holder, int position) 的文档说明:

Called by RecyclerView to display the data at the specified position. This method should update the contents of the ViewHolder to reflect the item at the given position.

Note that unlike ListView, RecyclerView will not call this method again if the position of the item changes in the data set unless the item itself is invalidated or the new position cannot be determined. For this reason, you should only use the position parameter while acquiring the related data item inside this method and should not keep a copy of it. If you need the position of an item later on (e.g. in a click listener), use ViewHolder.getAdapterPosition() which will have the updated adapter position.

文档的Note说:

与ListView不同,如果Item的位置在数据集中变化,RecyclerView将不会再次调用此方法,除非Item本身无效或新位置无法确定。 因此,只能在此方法中的获取相关数据时使用position参数,并且不应保留其副本。 如果稍后需要某个Item的位置(例如在点击监听器中),使用具有更新的适配器位置的ViewHolder.getAdapterPosition()。

所以这里的CheckBox侦听应该这么写,此时代码检查已经是 0 warning


holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

@Override

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

int data_position = holder.getAdapterPosition();

refData.get(data_position).selected = isChecked;
}
});

时间: 2024-11-05 18:28:31

处理RecyclerView的条目点击和多选的相关文章

RecyclerView实现条目Item拖拽排序与滑动删除

RecyclerView实现条目Item拖拽排序与滑动删除 版权声明:转载请注明本文转自严振杰的博客: http://blog.csdn.net/yanzhenjie1003 效果演示 直播视频讲解:[http://pan.baidu.com/s/1miEOtwG1 推荐大家结合我直播的视频看效果更好. 本博客源码传送门. 需求和技术分析 RecyclerView Item拖拽排序::长按RecyclerView的Item或者触摸Item的某个按钮. RecyclerView Item滑动删除:

从源码角度入手实现RecyclerView的Item点击事件

转载请注明出处:http://www.cnblogs.com/cnwutianhao/p/6758373.html RecyclerView 作为 ListView 和 GridView 的替代产物,相信在Android界已广为流传. RecyclerView 本是不会有类似 ListView 的那种点击事件,但是知道和会用又是两种情况,跟随我一起从源码角度分析,RecyclerView 点击事件. 首先看一下 Google 对 ListView 家族谱的介绍: 可以看出 ListView 归根

Ztree _ 横向显示子节点、点击文字勾选、去除指定元素input的勾选状态

前些天项目需要树结构表现数据,需求ztree就能满足所以直接使用ztree只是踩了些小坑... 1.ztree子节点横向显示(下图): 效果说明:第三级子节点按需求横向显示其他竖向显示,每行最多显示5个(修改位置在zTreeStyle.css里面哦,在外面设置不上的,页面也获取不到想要设置样式的节点...如果你能还望赐教)代码如下: 1 .ztree>li>ul>li>ul>li>ul{overflow:hidden;} 2 .ztree>li>ul>

listview设置条目点击的时候不变色(让状态选择器不起作用)

未设置前的效果如下图: 很明显,“酷狗音乐”那个条目被点击的时候,条目背景变为蓝色,怎么去掉这个颜色呢? java代码可以这么写: 1 listView.setSelector(new ColorDrawable());//设置默认状态选择器为全透明,不传颜色就是没颜色 效果如下图:

Android 高级UI设计笔记20:RecyclerView 的详解之RecyclerView添加Item点击事件

1. 引言: RecyclerView侧重的是布局的灵活性,虽说可以替代ListView但是连基本的点击事件都没有,这篇文章就来详细讲解如何为RecyclerView的item添加点击事件,顺便复习一下观察者模式. 2. 最终目的 模拟ListView的setOnItemClickListener()方法,调用者只须调用类似于setOnItemClickListener的东西就能获得被点击item的相关数据.   3. 原理 为RecyclerView的每个子item设置setOnClickLi

ListView中itemz中控件的点击事件和条目点击事件冲突

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:descendantFocusability="blocksDescendants&quo

JavaScript实现单击全选 ,再次点击取消全选

             以下为实现思路,已测试,供参考 var allSet = document.getElementById('allSet');//获取全选按钮元素 var a = allSet.Custom;//给全选按钮自定义属性 a = 0;//自定义属性值为0 var input1 = all.getElementsByTagName('input');//获取all下的全部input标签; //给全选按钮添加点击事件,进行判断; allSet.onclick = functio

radio点击一下选中,再点击恢复未选状态

实现方式1: <input   type="radio"   id="cat"   name="cat"   value="1"   onclick= "if(this.c==1){this.c=0;this.checked=0}else{this.c=1}"   c="0"/> 实现方式2: <input    type="radio"     n

全部选中和删除选中商品的实现,点击一下全选,点击两下取消全选

<th class="wp7_5"><input type="checkbox" id="checkAllId" onclick="checkAll(this);" class="vm" /> 全选</th> <div> <td><input type="checkbox" th:name="${#strings