今天在做項(xiàng)目的1個(gè)我的收藏頁(yè)面時(shí)要實(shí)現(xiàn)這么1個(gè)效果:
每一個(gè)item 前面都有1個(gè)checkbox ,主要布局是recycleview 。當(dāng)我們選中某項(xiàng)時(shí),繼續(xù)往下滑動(dòng)下面某個(gè)的checkbox也會(huì)變成選中狀態(tài)。
解決方法1比較暴力 viewHolder.setIsRecyclable(false);
這樣viewholder就不進(jìn)行復(fù)用,也不存在checkbox 混亂選中的問(wèn)題了,但是 你滑動(dòng)的時(shí)候卡的要死。
第2種就是在獲得到的bean中設(shè)置1個(gè)標(biāo)志位,但是需要修改bean 。雖然只是加個(gè)字段的問(wèn)題,但是不建議。
第3種就是用個(gè)輔助list記錄選中的item. 這還不夠,還要配合viewholder的settag().
1.在綁定view的時(shí)候
viewHolder.checkBox.setTag(new Integer(position));//設(shè)置tag 否則劃回來(lái)時(shí)選中消失
if (checkPositionlist != null) {
((MyViewHolder) holder).checkBox.setChecked((checkPositionlist.contains(new Integer(position)) ? true : false));
} else {
((MyViewHolder) holder).checkBox.setChecked(false);
}
2.選中監(jiān)聽(tīng)事件:
viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
MyCollectionBaseBean baseBean = data.getFavoritesList().get(position);
if (isChecked) {
//Log.e("fangchao 1", viewHolder.checkBox.getTag() + "");
if (!checkPositionlist.contains(viewHolder.checkBox.getTag())) {//這句要有 ,否則不復(fù)用了,但是你再滑動(dòng)回去的時(shí)候,都成了為選中。這是由于你的item滑出可視范圍時(shí),就會(huì)觸發(fā)oncheckchange事件,所以用第1步綁定的tag進(jìn)行2次判斷。避免選中的丟失
checkeddata.add(baseBean);
checkPositionlist.add(new Integer(position));
}
} else {
//Log.e("fangchao 2", viewHolder.checkBox.getTag() + "");
if (checkPositionlist.contains(viewHolder.checkBox.getTag()))//這句同上,2次判斷{
checkeddata.remove(baseBean);
checkPositionlist.remove(new Integer(position));
}
}
}
});
完全代碼,自己摘著看:
/**
* Created By Fangchao On 2015/3/5
*/
public class CollectionAdapter extends FooterAdapter {
private MyCollectionListBean data;// 元數(shù)據(jù)
private List<MyCollectionBaseBean> checkeddata = new ArrayList<>();// 選中的數(shù)據(jù)
private ImageLoader mImageLoader;
private List<Integer> checkPositionlist;
public CollectionAdapter(MyCollectionListBean data) {
this.data = data;
mImageLoader = new ImageLoader(MyApplication.getInstance()
.getRequestQueue(), BitmapCache.getInstance());
checkPositionlist = new ArrayList<>();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView txt_onsale, txt_mj, txt_present, goodsname, goods_describe;
public TextView price, mark_price, commentsnums;
CheckBox checkBox;
NetworkImageView goods_img;
public View v;
public MyViewHolder(View v) {
super(v);
this.v = v;
txt_onsale = (TextView) v.findViewById(R.id.txt_onsale);
txt_mj = (TextView) v.findViewById(R.id.txt_mj);
txt_present = (TextView) v.findViewById(R.id.txt_present);
goods_describe = (TextView) v.findViewById(R.id.tv_production_describ);
goodsname = (TextView) v.findViewById(R.id.tv_goods_name);
price = (TextView) v.findViewById(R.id.tv_goods_price);
mark_price = (TextView) v.findViewById(R.id.tv_goods_markprice);
commentsnums = (TextView) v.findViewById(R.id.tv_goods_commentsnums);
checkBox = (CheckBox) v.findViewById(R.id.collection_cb);
goods_img = (NetworkImageView) v.findViewById(R.id.mycollection_item_image);
}
}
@Override
public boolean useFooter() {
return true;
}
@Override
public RecyclerView.ViewHolder onCreateContentItemViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.item_collection, parent, false);
MyViewHolder vh = new MyViewHolder(v);
return vh;
}
@Override
public void onBindContentItemView(RecyclerView.ViewHolder holder, final int position) {
MyViewHolder viewHolder = (MyViewHolder) holder;
// viewHolder.setIsRecyclable(false);
viewHolder.goodsname.setText(data.getFavoritesList().get(position).getGoods().getGoodsName());
if (StringUtils.isBlank(data.getFavoritesList().get(position).getGoods().getGoodsSlogan())) {
viewHolder.goods_describe.setVisibility(View.GONE);
} else {
viewHolder.goods_describe.setVisibility(View.VISIBLE);
viewHolder.goods_describe.setText(data.getFavoritesList().get(position).getGoods().getGoodsSlogan());
}
viewHolder.price.setText(PriceTools.formatStr(data.getFavoritesList().get(position).getGoods().getShopPrice()));
viewHolder.price.setTextColor(Color.parseColor("#E5004B"));
viewHolder.mark_price.setText(PriceTools.formatStr(data.getFavoritesList().get(position).getGoods().getMarketPrice()));
viewHolder.mark_price.setBackgroundResource(0);
viewHolder.mark_price.getPaint().setFlags(
Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG); // 設(shè)置中劃線并加清晰
viewHolder.commentsnums.setText(data.getFavoritesList().get(position).getGoods().getCommentCount());
viewHolder.checkBox.setTag(new Integer(position));//設(shè)置tag 否則劃回來(lái)時(shí)選中消失
//checkbox 復(fù)用問(wèn)題
if (checkPositionlist != null) {
((MyViewHolder) holder).checkBox.setChecked((checkPositionlist.contains(new Integer(position)) ? true : false));
} else {
((MyViewHolder) holder).checkBox.setChecked(false);
}
//Log.e("ffff",position+"");
viewHolder.goods_img.setDefaultImageResId(R.drawable.item_default_img);
viewHolder.goods_img.setErrorImageResId(R.drawable.item_default_img_err);
viewHolder.goods_img.setImageUrl(data.getFavoritesList().get(position).getGoods().getImgFile(), mImageLoader);
if (data.getFavoritesList().get(position).getGoods().getIsOnSale().equals("false")) {
//下架
viewHolder.price.setText("本商品已下架");
viewHolder.price.setTextColor(Color.GRAY);
viewHolder.mark_price.setText("");
} else if (data.getFavoritesList().get(position).getGoods().isIsNoStock()) {
//缺貨
viewHolder.mark_price.setBackgroundResource(R.drawable.ticket_is_outof_date_bg);
viewHolder.mark_price.setText(" 缺貨 ");
viewHolder.price.setTextColor(Color.GRAY);
viewHolder.mark_price.getPaint().setFlags(0);
}
//cb 的選中事件
onchecked(viewHolder, position);
}
private void onchecked(final MyViewHolder viewHolder, final int position) {
viewHolder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
MyCollectionBaseBean baseBean = data.getFavoritesList().get(position);
if (isChecked) {
//Log.e("fcccc 1", viewHolder.checkBox.getTag() + "");
if (!checkPositionlist.contains(viewHolder.checkBox.getTag())) {
checkeddata.add(baseBean);
checkPositionlist.add(new Integer(position));
}
} else {
//Log.e("fcccc 2", viewHolder.checkBox.getTag() + "");
if (checkPositionlist.contains(viewHolder.checkBox.getTag())) {
checkeddata.remove(baseBean);
checkPositionlist.remove(new Integer(position));
}
}
}
});
}
@Override
public int getContentItemCount() {
if (data != null)
return data.getFavoritesList().size();
else return 0;
}
@Override
public int getContentItemType(int position) {
return 0;
}
public void getdata(MycheckListener listener) {
listener.getcheckeddata(checkeddata);
}
public interface MycheckListener {
void getcheckeddata(List<MyCollectionBaseBean> listBean);
}
}