展会信息港展会大全

android 随手记 listview多选实现
来源:互联网   发布日期:2015-11-26 13:28:00   浏览:1438次  

导读:天继续和大家分享涉及到listview的内容。在很多时候,我们会用到listview和checkbox配合来提供给用户一些选择操作。比如在一个清单页面,我们需要记录用户勾选了哪些条目。这个的实...

天继续和大家分享涉及到listview的内容。在很多时候,我们会用到listview和checkbox配合来提供给用户一些选择操作。比如在一个清单页面,我们需要记录用户勾选了哪些条目。这个的实现并不太难,但是有很多朋友来问我如何实现,他们有遇到各种各样的问题,这里就一并写出来和大家一起分享。

ListView的操作就一定会涉及到item和Adapter,我们还是先来实现这部分内容。

首先,写个item的xml布局,里面放置一个TextView和一个CheckBox。要注意的时候,这里我设置了CheckBox没有焦点,这样的话,无法单独点击checkbox,而是在点击listview的条目后,Checkbox会响应操作。

[html]

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:orientation="horizontal" >

<TextView

android:id="@+id/item_tv"

android:layout_width="0dp"

android:layout_height="wrap_content"

android:layout_weight="1"

android:gravity="center_vertical"

/>

<CheckBox

android:id="@+id/item_cb"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:clickable="false"

android:focusable="false"

android:focusableInTouchMode="false"

android:gravity="center_vertical"

/>

</LinearLayout>

下面就写一个Adapter类,我们依然继承BaseAdapter类。这里我们使用一个HashMap<Integer,boolean>的键值来记录checkbox在对应位置的选中状况,这是本例的实现的基矗

[java]

package com.notice.listcheck;

import java.util.ArrayList;

import java.util.HashMap;

import android.content.Context;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.CheckBox;

import android.widget.TextView;

public class MyAdapter extends BaseAdapter{

// 填充数据的list

private ArrayList<String> list;

// 用来控制CheckBox的选中状况

private static HashMap<Integer,Boolean> isSelected;

// 上下文

private Context context;

// 用来导入布局

private LayoutInflater inflater = null;

// 构造器

public MyAdapter(ArrayList<String> list, Context context) {

this.context = context;

this.list = list;

inflater = LayoutInflater.from(context);

isSelected = new HashMap<Integer, Boolean>();

// 初始化数据

initDate();

}

// 初始化isSelected的数据

private void initDate(){

for(int i=0; i<list.size();i++) {

getIsSelected().put(i,false);

}

}

@Override

public int getCount() {

return list.size();

}

@Override

public Object getItem(int position) {

return list.get(position);

}

@Override

public long getItemId(int position) {

return position;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder = null;

if (convertView == null) {

// 获得ViewHolder对象

holder = new ViewHolder();

// 导入布局并赋值给convertview

convertView = inflater.inflate(R.layout.listviewitem, null);

holder.tv = (TextView) convertView.findViewById(R.id.item_tv);

holder.cb = (CheckBox) convertView.findViewById(R.id.item_cb);

// 为view设置标签

convertView.setTag(holder);

} else {

// 取出holder

holder = (ViewHolder) convertView.getTag();

}

// 设置list中TextView的显示

holder.tv.setText(list.get(position));

// 根据isSelected来设置checkbox的选中状况

holder.cb.setChecked(getIsSelected().get(position));

return convertView;

}

public static HashMap<Integer,Boolean> getIsSelected() {

return isSelected;

}

public static void setIsSelected(HashMap<Integer,Boolean> isSelected) {

MyAdapter.isSelected = isSelected;

}

}

注释已经写的非常详尽了,通过

holder.cb.setChecked(getIsSelected().get(position));

这行代码我们实现了设置CheckBox的选中状况。

那么我们只需要在点击事件中,控制isSelected的键值即可控制对应位置checkbox的选中了。

在Activity中我们除了放置一个ListView外,还放置了三个按钮,分别实现全选,取消和反眩

看下Activity类的代码:

[java]

package com.notice.listcheck;

import java.util.ArrayList;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.AdapterView;

import android.widget.AdapterView.OnItemClickListener;

import android.widget.Button;

import android.widget.ListView;

import android.widget.TextView;

public class Ex_checkboxActivity extends Activity {

private ListView lv;

private MyAdapter mAdapter;

private ArrayList<String> list;

private Button bt_selectall;

private Button bt_cancel;

private Button bt_deselectall;

private int checkNum; // 记录选中的条目数量

private TextView tv_show;// 用于显示选中的条目数量

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

/* 实例化各个控件 */

lv = (ListView) findViewById(R.id.lv);

bt_selectall = (Button) findViewById(R.id.bt_selectall);

bt_cancel = (Button) findViewById(R.id.bt_cancelselectall);

bt_deselectall = (Button) findViewById(R.id.bt_deselectall);

tv_show = (TextView) findViewById(R.id.tv);

list = new ArrayList<String>();

// 为Adapter准备数据

initDate();

// 实例化自定义的MyAdapter

mAdapter = new MyAdapter(list, this);

// 绑定Adapter

lv.setAdapter(mAdapter);

// 全选按钮的回调接口

bt_selectall.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// 遍历list的长度,将MyAdapter中的map值全部设为true

for (int i = 0; i < list.size(); i++) {

MyAdapter.getIsSelected().put(i, true);

}

// 数量设为list的长度

checkNum = list.size();

// 刷新listview和TextView的显示

dataChanged();

}

});

// 取消按钮的回调接口

bt_cancel.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// 遍历list的长度,将已选的按钮设为未选

for (int i = 0; i < list.size(); i++) {

if (MyAdapter.getIsSelected().get(i)) {

MyAdapter.getIsSelected().put(i, false);

checkNum--;// 数量减1

}

}

// 刷新listview和TextView的显示

dataChanged();

}

});

// 反选按钮的回调接口

bt_deselectall.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

// 遍历list的长度,将已选的设为未选,未选的设为已选

for (int i = 0; i < list.size(); i++) {

if (MyAdapter.getIsSelected().get(i)) {

MyAdapter.getIsSelected().put(i, false);

checkNum--;

} else {

MyAdapter.getIsSelected().put(i, true);

checkNum++;

}

}

// 刷新listview和TextView的显示

dataChanged();

}

});

// 绑定listView的监听器

lv.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,

long arg3) {

// 取得ViewHolder对象,这样就省去了通过层层的findViewById去实例化我们需要的cb实例的步骤

ViewHolder holder = (ViewHolder) arg1.getTag();

// 改变CheckBox的状态

holder.cb.toggle();

// 将CheckBox的选中状况记录下来

MyAdapter.getIsSelected().put(arg2, holder.cb.isChecked());

// 调整选定条目

if (holder.cb.isChecked() == true) {

checkNum++;

} else {

checkNum--;

}

// 用TextView显示

tv_show.setText("已选中"+checkNum+"项");

}

});

}

// 初始化数据

private void initDate() {

for (int i = 0; i < 15; i++) {

list.add("data" + "" + i);

}

}

// 刷新listview和TextView的显示

private void dataChanged() {

// 通知listView刷新

mAdapter.notifyDataSetChanged();

// TextView显示最新的选中数目

tv_show.setText("已选中" + checkNum + "项");

}

}

赞助本站

人工智能实验室

相关热词: android开发 教程

相关内容
AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港