如何设置recyclerview获取item item 不被复用

& 无论Recycler或者ListView都采用复用机制这是两个控件的精华所在,但是这个复用机制在某些特定的情况总会给我们带来不必须要的烦恼,我模拟一下RecyclerView的复用,条目上的控件只用TextView和CheckBox,我们先来看下Item的XML文件&?xml version=&1.0& encoding=&utf-8&?&
&LinearLayout xmlns:android=&/apk/res/android&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:orientation=&horizontal&&
android:id=&@+id/item_tv&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_marginLeft=&20dp&
android:text=&测试一下&
android:textColor=&@android:color/holo_blue_light&
android:textSize=&14sp& /&
android:id=&@+id/item_cb&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_marginLeft=&50dp& /&
&/LinearLayout&
下面展示一下复用的情况和代码
明显看到条目被复用了,关于条目复用解决方案查了下大致分为两种,一种通过Map集合管理View和Position,一种是通过集合存储当前的点击状态,关于第一种方案,做过测试,绕过了复用机制,数据量小的情况下可以使用,但是数据量过大内存开销很大,有兴趣的朋友可以尝试下,本文主要说第二种方案,在保留复用机制的前提下,解决复用!直接关键处代码
holder.cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (!l.contains(position)) {
l.add(position);
if (l.contains(position)) {
int i = l.indexOf(position);
l.remove(i);
holder.cb.setChecked(l.contains(position) ? true : false);//还原状态
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2446次
排名:千里之外
(6)(1)(5)(2)2016年4月 移动开发大版内专家分月排行榜第二
2016年7月 移动开发大版内专家分月排行榜第三2015年12月 移动开发大版内专家分月排行榜第三
2016年10月 移动开发大版内专家分月排行榜第三
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。1751人阅读
其他(20)
RecyclerView 复用出现 CheckBox 或者 设置背景混乱问题
由于RecyclerView 与ListView 都使用了复用技术,所以会出现滚动后出现CheckBox选中混乱或者是Item的背景混乱问题。在OnBindViewHolder(...)方法中添加
public class MyShopingCartAdapter extends RecyclerView.Adapter&MyShopingCartAdapter.ViewHoder& {
private List&ShopingCart&
private OnItemL
private List&Integer& listCb = new ArrayList&&();//用于记录位置
public void setOnItemListener(OnItemListener onItemListener) {
this.listener = onItemL
public MyShopingCartAdapter(List&ShopingCart& list, Context context) {
this.list =
Fresco.initialize(context);
public ViewHoder onCreateViewHolder(ViewGroup parent, int viewType) {
ViewHoder viewHoder = new ViewHoder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_shoping_cart, parent, false));
return viewH
public void onBindViewHolder(final ViewHoder holder, final int position) {
holder.tvTitle.setText(list.get(position).getTitle());
MyFresco.myDownload(holder.imgItem, list.get(position).getImgItem());
holder.tvHorses.setText(list.get(position).getHorses());
holder.tvModel.setText(list.get(position).getModel());
holder.tvPrice.setText(list.get(position).getPrice());
holder.edNumber.setText(list.get(position).getNumber());/*在这里进行选中操作*/
holder.cbShoping.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
if (!listCb.contains(holder.cbShoping.getTag())) {
listCb.add(position);//选中时添加
if (listCb.contains(holder.cbShoping.getTag())) {
listCb.remove(position);//没选中时移除
});/*初始判断*/
if (listCb != null) {
holder.cbShoping.setChecked(listCb.contains(position) ? true : false);
holder.cbShoping.setChecked(false);
public int getItemCount() {
return list.size();
public class ViewHoder extends RecyclerView.ViewHolder {
private TextView tvT
private CheckBox cbS
private SimpleDraweeView imgI
private TextView tvHorses, tvModel, tvP
private EditText edN
private RelativeLayout rlReduce, rlP
public ViewHoder(View itemView) {
super(itemView);
tvTitle = (TextView) itemView.findViewById(R.id.tvTitle);
cbShoping = (CheckBox) itemView.findViewById(R.id.cbShoping);
imgItem = (SimpleDraweeView) itemView.findViewById(R.id.imgItem);
tvHorses = (TextView) itemView.findViewById(R.id.tvHorses);
tvModel = (TextView) itemView.findViewById(R.id.tvModel);
tvPrice = (TextView) itemView.findViewById(R.id.tvPrice);
edNumber = (EditText) itemView.findViewById(R.id.edNumber);
rlPlus = (RelativeLayout) itemView.findViewById(R.id.rlPlus);
rlReduce = (RelativeLayout) itemView.findViewById(R.id.rlReduce);
itemView.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (listener != null) {
listener.onClick(v, getLayoutPosition(), list.get(getLayoutPosition()));
public interface OnItemListener {
void onClick(View v, int pos, ShopingCart shopingCart);
& & &通过一个List来辅助保存CheckBox的选中状态,把选中的checkBox的position放到List中,在初始化CheckBox的时候来重新设置checkBox的选中状态。在checkBox的CheckedChangedListener 来添加 或者删除 List中保存的选中状态。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:42011次
排名:千里之外
原创:21篇
转载:21篇
(12)(1)(3)(3)(2)(16)(3)(2)匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。

我要回帖

更多关于 recyclerviewitem高度 的文章

 

随机推荐