package com.mcxtzhang.selectcoupondemo.recyclerview; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.mcxtzhang.selectcoupondemo.R; import com.mcxtzhang.selectcoupondemo.TestBean; import com.mcxtzhang.selectcoupondemo.listview.ListViewActivity; import java.util.List; /** * 介绍: * 作者:zhangxutong * 邮箱:zhangxutong@imcoming.com * 时间: 2016/9/29. */ public class CouponAdapter extends RecyclerView.Adapter<CouponAdapter.CouponVH> { private List<TestBean> mDatas; private Context mContext; private LayoutInflater mInflater; private int mSelectedPos = -1;//实现单选 方法二,变量保存当前选中的position private RecyclerView mRv;//实现单选方法三: RecyclerView另一种定向刷新方法: public CouponAdapter(List<TestBean> datas, Context context, RecyclerView rv) { mDatas = datas; mContext = context; mInflater = LayoutInflater.from(mContext); mRv = rv; //实现单选方法二: 设置数据集时,找到默认选中的pos for (int i = 0; i < mDatas.size(); i++) { if (mDatas.get(i).isSelected()) { mSelectedPos = i; } } } @Override public CouponVH onCreateViewHolder(ViewGroup parent, int viewType) { return new CouponVH(mInflater.inflate(R.layout.item_coupon, parent, false)); } @Override public void onBindViewHolder(final CouponVH holder, final int position) { Log.d("TAG", "onBindViewHolder() called with: holder = [" + holder + "], position = [" + position + "]"); holder.ivSelect.setSelected(mDatas.get(position).isSelected()); holder.tvCoupon.setText(mDatas.get(position).getName()); holder.ivSelect.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { //实现单选,第一种方法,十分简单, Lv Rv通用,因为它们都有notifyDataSetChanged()方法 // 每次点击时,先将所有的selected设为false,并且将当前点击的item 设为true, 刷新整个视图 /* for (TestBean data : mDatas) { data.setSelected(false); } mDatas.get(position).setSelected(true); notifyDataSetChanged();*/ //实现单选方法二: notifyItemChanged() 定向刷新两个视图 //如果勾选的不是已经勾选状态的Item /* if (mSelectedPos!=position){ //先取消上个item的勾选状态 mDatas.get(mSelectedPos).setSelected(false); notifyItemChanged(mSelectedPos); //设置新Item的勾选状态 mSelectedPos = position; mDatas.get(mSelectedPos).setSelected(true); notifyItemChanged(mSelectedPos); }*/ //实现单选方法三: RecyclerView另一种定向刷新方法:不会有白光一闪动画 也不会重复onBindVIewHolder CouponVH couponVH = (CouponVH) mRv.findViewHolderForLayoutPosition(mSelectedPos); if (couponVH != null) {//还在屏幕里 couponVH.ivSelect.setSelected(false); }else {//add by 2016 11 22 for 一些极端情况,holder被缓存在Recycler的cacheView里, //此时拿不到ViewHolder,但是也不会回调onBindViewHolder方法。所以add一个异常处理 notifyItemChanged(mSelectedPos); } mDatas.get(mSelectedPos).setSelected(false);//不管在不在屏幕里 都需要改变数据 //设置新Item的勾选状态 mSelectedPos = position; mDatas.get(mSelectedPos).setSelected(true); holder.ivSelect.setSelected(true); //实现单选方法四: /* if (mSelectedPos != position) { //先取消上个item的勾选状态 mDatas.get(mSelectedPos).setSelected(false); //传递一个payload Bundle payloadOld = new Bundle(); payloadOld.putBoolean("KEY_BOOLEAN", false); notifyItemChanged(mSelectedPos, payloadOld); //设置新Item的勾选状态 mSelectedPos = position; mDatas.get(mSelectedPos).setSelected(true); Bundle payloadNew = new Bundle(); payloadNew.putBoolean("KEY_BOOLEAN", true); notifyItemChanged(mSelectedPos, payloadNew); }*/ } }); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mContext.startActivity(new Intent(mContext, ListViewActivity.class)); } }); } @Override public void onBindViewHolder(CouponVH holder, int position, List<Object> payloads) { Log.d("TAG", "onBindViewHolder() called with: holder = [" + holder + "], position = [" + position + "], payloads = [" + payloads + "]"); if (payloads.isEmpty()) { onBindViewHolder(holder, position); } else { Bundle payload = (Bundle) payloads.get(0); if (payload.containsKey("KEY_BOOLEAN")) { boolean aBoolean = payload.getBoolean("KEY_BOOLEAN"); holder.ivSelect.setSelected(aBoolean); } } } @Override public int getItemCount() { return null != mDatas ? mDatas.size() : 0; } public static class CouponVH extends RecyclerView.ViewHolder { private ImageView ivSelect; private TextView tvCoupon; public CouponVH(View itemView) { super(itemView); ivSelect = (ImageView) itemView.findViewById(R.id.ivSelect); tvCoupon = (TextView) itemView.findViewById(R.id.tvCoupon); } } }