package com.mcxtzhang.selectcoupondemo.listview;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.mcxtzhang.selectcoupondemo.R;
import com.mcxtzhang.selectcoupondemo.TestBean;
import java.util.List;
import static com.mcxtzhang.selectcoupondemo.R.id.ivSelect;
import static com.mcxtzhang.selectcoupondemo.R.id.tvCoupon;
/**
* 介绍:ListView的Adapter
* 作者:zhangxutong
* 邮箱:zhangxutong@imcoming.com
* 时间: 2016/9/29.
*/
public class ListCouponAdapter extends BaseAdapter {
private List<TestBean> mDatas;
private Context mContext;
private LayoutInflater mInflater;
private int mSelectedPos = -1;//实现单选 方法二,变量保存当前选中的position
private ListView mLv;//需要利用Lv获取某个postion的view
public ListCouponAdapter(List<TestBean> datas, Context context, ListView listView) {
mDatas = datas;
mContext = context;
mInflater = LayoutInflater.from(mContext);
//实现单选方法二: 设置数据集时,找到默认选中的pos
for (int i = 0; i < mDatas.size(); i++) {
if (mDatas.get(i).isSelected()) {
mSelectedPos = i;
}
}
mLv = listView;
}
@Override
public int getCount() {
return null != mDatas ? mDatas.size() : 0;
}
@Override
public Object getItem(int i) {
return mDatas.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(final int position, View view, ViewGroup viewGroup) {
final CouponVH couponVH;
if (view == null) {
view = mInflater.inflate(R.layout.item_coupon, viewGroup, false);
couponVH = new CouponVH();
couponVH.ivSelect = (ImageView) view.findViewById(ivSelect);
couponVH.tvCoupon = (TextView) view.findViewById(tvCoupon);
view.setTag(couponVH);
} else {
couponVH = (CouponVH) view.getTag();
}
couponVH.ivSelect.setSelected(mDatas.get(position).isSelected());
couponVH.tvCoupon.setText(mDatas.get(position).getName());
couponVH.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();*/
//实现单选:方法二:Lv的定向刷新
//如果 当前选中的View 在当前屏幕可见,且不是自己,要定向刷新一下之前的View的状态
if (position != mSelectedPos) {
int firstPos = mLv.getFirstVisiblePosition() - mLv.getHeaderViewsCount();//这里考虑了HeaderView的情况
int lastPos = mLv.getLastVisiblePosition() - mLv.getHeaderViewsCount();
if (mSelectedPos >= firstPos && mSelectedPos <= lastPos) {
View lastSelectedView = mLv.getChildAt(mSelectedPos - firstPos);//取出选中的View
CouponVH lastVh = (CouponVH) lastSelectedView.getTag();
lastVh.ivSelect.setSelected(false);
}
//不管在屏幕是否可见,都需要改变之前的data
mDatas.get(mSelectedPos).setSelected(false);
//改变现在的点击的这个View的选中状态
couponVH.ivSelect.setSelected(true);
mDatas.get(position).setSelected(true);
mSelectedPos = position;
}
}
});
return view;
}
public static class CouponVH {
private ImageView ivSelect;
private TextView tvCoupon;
}
}