listview实现多选:
原理:在adapter中新建一个hashset存放多选时被选中的item的postion。
然后定义一个变量,代表2中模式,比如变量等于1时代表单选模式,等于2时代表多选模式。
在getView中,根据模式的不同以及是否选中状态来设置相应的view的相应的状态。
然后就是在listview的setOnItemClickListener中根据模式的不同来设置对应的点击事件了。
先看item的布局:
多选之未选中状态,把imageview设置为可见
多选之已选中状态,把imageview设置为可见且设置一张已选中的图片
单选状态
下面是adapter的完整代码
package com.tianxia.hnq.erweima;
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.TextView;
import java.util.HashSet;
import java.util.List;
import butterknife.BindView;
import butterknife.ButterKnife;
/**
* Created by Administrator on 16-9-8.
*/
public class Adpter001 extends BaseAdapter {
private Context context;
private List<String> listName;
private List<String> listTel;
public static final int MODE_DANXUAN=1;//单选模式
public static final int MODE_DUOXUAN=2;//多选模式 默认单选模式
private int MODE=1;//默认等于单选模式
private HashSet<Integer> set;//保存多选状态下的变量
public Adpter001(Context context, List<String> listName, List<String> listTel) {
this.context = context;
this.listName = listName;
this.listTel = listTel;
set=new HashSet<>();
}
@Override
public int getCount() {
return listName.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
convertView = LayoutInflater.from(context).inflate(R.layout.item_name, null);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.name.setText(listName.get(position) + "");
viewHolder.tel.setText(listTel.get(position) + "");
if(MODE==MODE_DANXUAN){
viewHolder.xuanzhong.setVisibility(View.GONE);
}else{
viewHolder.xuanzhong.setVisibility(View.VISIBLE);
if(set.contains(position)){
viewHolder.xuanzhong.setImageResource(R.mipmap.xz);
}else{
viewHolder.xuanzhong.setImageResource(R.mipmap.wxz);
}
}
return convertView;
}
static class ViewHolder {
@BindView(R.id.name)
TextView name;
@BindView(R.id.tel)
TextView tel;
@BindView(R.id.xuanzhong)
ImageView xuanzhong;
ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
//设置模式
public void startMode(int mode){
MODE=mode;
this.notifyDataSetChanged();
}
//得到当前的模式
public int getMode(){
return MODE;
}
//多选之添加
public void add(int position){
set.add(position);
this.notifyDataSetChanged();
}
//多选之删除
public void remove(int position){
set.remove(position);
this.notifyDataSetChanged();
}
//获取存储的set集合
public HashSet<Integer> getSet(){
return set;
}
//清空set集合
public void clear(){
set.clear();
this.notifyDataSetChanged();
}
}
下面是listview的代码:
listview001.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (adpter001.getMode() == Adpter001.MODE_DANXUAN) {
String s = zuHeString(listName.get(position), listTel.get(position));
Intent intent = new Intent(Main2Activity.this, ErWeiActivity.class);
intent.putExtra("data", s);
startActivity(intent);
} else {//多选
set=adpter001.getSet();
if(!set.contains(position)&&adpter001.getSet().size()<10){//如果没有选中就选中
adpter001.add(position);
}else{//如果选中了就取消选中
adpter001.remove(position);
}
shuliang.setText(adpter001.getSet().size()+"/10");
}
}
});
我这里设置了最多只能选10个。
很简单的就实现了多选功能,另:listview自带了多选功能的,但我觉得不好用,且不好看,所以没用。
以上如有错误或BUG欢饮指正