需求:ListView长按后显示复选框,然后可以点击。点击条目,在一个容器中动态创建对应的项目,条目的选中状态改变。再次点击条目,容器里的项目清除,条目选中状态恢复;点击容器里的项目即清除,同时对应条目状态复位。
先看一下效果:
思路
1. Activity的布局里注册ListView控件,Aty中findviewbyid到LV,给LV注册适配器,为LV添加长按和点击Item事件。
2. 点击事件中首先判断是否长按了。长按事件内打开一个开关。是则继续。
3. 然后,判断这个Item是不是被点击过。是:从容器清除、通过适配器刷新改变状态。否:添加到容器、刷新适配器
4. 适配器内提供public的添加和删除方法,对内部的一个用于存储选中ITEM集合操作,同时刷新适配器。
5. 容器中的项目有个单独的布局及对应的自定义View,提供一个set方法,设置显示的姓名。
关键代码
1.ListView事件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
// 实例化控件 private void initView() { mLVTo = (LinearLayout) findViewById(R.id.lv_to); // 顶部联系人容器 /** 联系人列表 **/ mLVDirectory = (ListView) findViewById(R.id.lv_directory); /** 适配器 **/ mAdapter = new LVAdapter(MainActivity.this, studentList); mLVDirectory.setAdapter(mAdapter); mLVDirectory.setOnItemClickListener(new OnItemClickListener() { // 条目点击 @Override public void onItemClick(AdapterView<?> adapter, View view, final int position, long id) { // id=position-headerView的个数(id < headerviewer的个数+用户view的个数),否则=-1 // 如果没有被长按过 if (!isLongPress) return; // 条目对应的学生信息 Student student = studentList.get(position); // 适配器内条目控制器 LVAdapter.HondlerView mAdapterHoldeView = (LVAdapter.HondlerView) view.getTag(); // 如果条目是已经选中的 if (mAdapterHoldeView.mIVCheck.isChecked()) { // 从适配器的选中集合删除,同时刷新 mAdapter.remove(studentList.get(position)); // 从顶部容器中删除 mLVTo.removeView(viewList.get(position)); // 从选中集合中删除 viewList.remove(position); } // 如果条目是没有被选中的 else { // 添加到适配器的选中集合,同时刷新 mAdapter.add(studentList.get(position)); /** 联系人View项目 */ final HolderView delView = new HolderView(MainActivity.this); delView.setName(student.getName()); delView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 从适配器的选中集合删除,同时刷新 mAdapter.remove(studentList.get(position)); // 从顶部容器中删除 mLVTo.removeView(viewList.get(position)); // 从选中集合中删除 viewList.remove(position); } }); mLVTo.addView(delView); viewList.put(position, delView); } } }); // 发生一次长按后,打开开关 mLVDirectory.setOnItemLongClickListener(new OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { mAdapter.setCheckBoxIsShow(true); isLongPress = true; Toast.makeText(MainActivity.this, "LongClick", 0).show(); return true; // 拦截住此时的按下事件 } }); } |
适配器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
/** 获取Item条目View **/ @Override public View getView(int position, View convertView, ViewGroup parent) { /**内部类bean:条目控制器**/ HondlerView mHV = null; if (convertView == null) { convertView = View.inflate(context, R.layout.item_listview, null); mHV = new HondlerView(); mHV.mIVAvatar = (ImageView) convertView.findViewById(R.id.iv_avatar); mHV.mTVName = (TextView) convertView.findViewById(R.id.tv_name); mHV.mTVAge = (TextView) convertView.findViewById(R.id.tv_age); mHV.mTVSex = (TextView) convertView.findViewById(R.id.tv_sex); mHV.mIVCheck = (CheckBox) convertView.findViewById(R.id.iv_check); convertView.setTag(mHV); } else { mHV = (HondlerView) convertView.getTag(); } Student student = list.get(position); mHV.mTVName.setText(student.getName()); mHV.mTVAge.setText(student.getAge() + ""); mHV.mTVSex.setText(student.getSex() == 0 ? "女" : "男"); /** 全局属性:是否选择了 **/ if (isChecked) { mHV.mIVCheck.setVisibility(View.VISIBLE); } else { mHV.mIVCheck.setVisibility(View.GONE); } /** 全局属性:被选择的学生 **/ if (posList.contains(student)) { // 集合中是否有此对象 mHV.mIVCheck.setChecked(true); } else { mHV.mIVCheck.setChecked(false); } return convertView; } /** * 设置选择状态<br/> * 同时适配器刷新 * @param isShowCheck */ public void setCheckBoxIsShow(boolean isChecked) { this.isChecked = isChecked; notifyDataSetChanged(); } /** * 向选中条目集合添加条目<br/> * 同时刷新适配器 * @param student */ public void add(Student student) { posList.add(student); notifyDataSetChanged(); } /** * 从选中条目集合删除条目<br/> * 同时刷新适配器 * @param student */ public void remove(Student student) { posList.remove(student); notifyDataSetChanged(); } |
源码:
http://code.taobao.org/p/DynamicView/src/DynamicView/
声明
本文由崔维友 威格灵 cuiweiyou vigiles cuiweiyou 原创,转载请注明出处:http://www.gaohaiyan.com/1642.html
承接App定制、企业web站点、办公系统软件 设计开发,外包项目,毕设