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欢饮指正