今天,我们来总结下ListView的选择,包括单选和多选。
一、单选:
第一步:在DemoActivity中声明并初始化一个变量。如下:
public int selectedPosition = -1;
第二步:在我们自定义的BaseAdapter的getView方法中,做如下处理:
if(position == ((DemoActivity)context).selectedPosition) {
holder.iv_select.setImageResource(R.mipmap.selected);
} else {
holder.iv_select.setImageResource(R.mipmap.un_selected);
}
第三步:在DemoActivity中,做如下处理:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
selectedPosition = position;
storeAdapter.notifyDataSetChanged();
//业务逻辑操作
}
});
二、多选:
实现多选,我们是在自定义的BaseAdapter中完成的。这里先直接上代码,然后我们再结合代码分析。
public class UserAdapter extends BaseAdapter{
private Context context;
private List<User> userList;
private Map<Integer, Integer> selected;
public UserAdapter(Context context, List<User> userList) {
this.context = context;
this.userList = userList;
selected = new HashMap<Integer, Integer>();
}
@Override
public int getCount() {
return userList.size();
}
@Override
public Object getItem(int position) {
return userList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup viewGroup) {
final ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item_user, null);
holder = new ViewHolder();
holder.iv_select= (ImageView) convertView.findViewById(R.id.iv_select);
holder.relativeLayout = (RelativeLayout) convertView.findViewById(R.id.relative);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
if (selected.containsKey(position)) {
holder.iv_select.setImageResource(R.mipmap.selected);
holder.relativeLayout.setTag(false);
} else {
holder.iv_select.setImageResource(R.mipmap.un_selected);
holder.relativeLayout.setTag(true);
}
holder.relativeLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if ((boolean)holder.relativeLayout.getTag()) {
if (!selected.containsKey(position)) {
selected.put(position, position);
}
holder.iv_select.setImageResource(R.mipmap.selected);
holder.relativeLayout.setTag(false);
//业务逻辑处理
} else {
selected.remove(position);
holder.iv_select.setImageResource(R.mipmap.un_selected);
holder.relativeLayout.setTag(true);
//业务逻辑处理
}
}
});
return convertView;
}
public class ViewHolder {
ImageView iv_select;
RelativeLayout relativeLayout;
}
}
注:这里只是要介绍如何实现ListView的多选,因此将其他业务方面的代码都剥离出去了。
好,我们现在来分析:
第一步:我们声明一个Map,然后在自定义的BaseAdapter的构造方法中实例化这个Map,我们用的是HashMap。
第二步:在getView方法中,通过如下代码进行初始化:
if (selected.containsKey(position)) {
holder.iv_select.setImageResource(R.mipmap.selected);
holder.relativeLayout.setTag(false);
} else {
holder.iv_select.setImageResource(R.mipmap.un_selected);
holder.relativeLayout.setTag(true);
}
第三步:通过如下代码进行我们的业务逻辑处理:
holder.relativeLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if ((boolean)holder.relativeLayout.getTag()) {
if (!selected.containsKey(position)) {
selected.put(position, position);
}
holder.iv_select.setImageResource(R.mipmap.selected);
holder.relativeLayout.setTag(false);
//业务逻辑处理
} else {
selected.remove(position);
holder.iv_select.setImageResource(R.mipmap.un_selected);
holder.relativeLayout.setTag(true);
//业务逻辑处理
}
}
});