Android中ListView结合CheckBox判断选中项

Posted dennyTao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android中ListView结合CheckBox判断选中项相关的知识,希望对你有一定的参考价值。

本文主要实现在自定义的ListView布局中加入CheckBox控件,通过判断用户是否选中CheckBox来对ListView的选中项进行相应的操作。通过一个Demo来展示该功能,选中ListView中的某一项,然后点击Button按钮来显示选中了哪些项。

[1] 程序结构图如下:

技术分享

其中Person.java是实体类,MainActivity.java是Activity组件类。listitem.xml是自定义的列表每项布局文件。

 

[2] listitem.xml布局文件源码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:orientation="vertical"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
  <LinearLayout
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:orientation="horizontal"
     android:descendantFocusability="blocksDescendants">
      <CheckBox
         android:id="@+id/list.select"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
      <TextView
         android:id="@+id/list.name"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:layout_weight="1"
         android:text="Name"
         android:layout_gravity="center"
         android:textSize="20dp"
         android:layout_marginLeft="10dp"/>
      <TextView
         android:id="@+id/list.address"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         android:layout_weight="1"
         android:text="Address"
         android:layout_gravity="center"
         android:textSize="20dp"/>
  </LinearLayout>
</LinearLayout>

 

[3] main.xml布局文件源码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <Button
       android:id="@+id/show"
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
       android:text="Show"/>
    <ListView
       android:id="@+id/lvperson"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"/>
</LinearLayout>

 

[4] Person.java实体类源码如下:

package com.andyidea.bean;

public class Person {

    private String name;
    private String address;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    
}

 

[5] MainActivity.java类源码如下:

package com.andyidea.listview;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import com.andyidea.bean.Person;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {
    
    Button show;
    ListView lv;
    List<Person> persons = new ArrayList<Person>();
    Context mContext;
    MyListAdapter adapter;
    List<Integer> listItemID = new ArrayList<Integer>();
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mContext = getApplicationContext();
        show = (Button)findViewById(R.id.show);
        lv = (ListView)findViewById(R.id.lvperson);
        
        initPersonData();
        adapter = new MyListAdapter(persons);
        lv.setAdapter(adapter);
        
        show.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                
                listItemID.clear();
                for(int i=0;i<adapter.mChecked.size();i++){
                    if(adapter.mChecked.get(i)){
                        listItemID.add(i);
                    }
                }
                
                if(listItemID.size()==0){
                    AlertDialog.Builder builder1 = new AlertDialog.Builder(MainActivity.this);
                    builder1.setMessage("没有选中任何记录");
                    builder1.show();
                }else{
                    StringBuilder sb = new StringBuilder();
                    
                    for(int i=0;i<listItemID.size();i++){
                        sb.append("ItemID="+listItemID.get(i)+" . ");
                    }
                    AlertDialog.Builder builder2 = new AlertDialog.Builder(MainActivity.this);
                    builder2.setMessage(sb.toString());
                    builder2.show();
                }
            }
        });
    }
    
    /**
     * 模拟数据
     */
    private void initPersonData(){
        Person mPerson;
        for(int i=1;i<=12;i++){
            mPerson = new Person();
            mPerson.setName("Andy"+i);
            mPerson.setAddress("GuangZhou"+i);
            persons.add(mPerson);
        }
    }
    
    //自定义ListView适配器
    class MyListAdapter extends BaseAdapter{
        List<Boolean> mChecked;
        List<Person> listPerson;
        HashMap<Integer,View> map = new HashMap<Integer,View>(); 
        
        public MyListAdapter(List<Person> list){
            listPerson = new ArrayList<Person>();
            listPerson = list;
            
            mChecked = new ArrayList<Boolean>();
            for(int i=0;i<list.size();i++){
                mChecked.add(false);
            }
        }

        @Override
        public int getCount() {
            return listPerson.size();
        }

        @Override
        public Object getItem(int position) {
            return listPerson.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view;
            ViewHolder holder = null;
            
            if (map.get(position) == null) {
                Log.e("MainActivity","position1 = "+position);
                
                LayoutInflater mInflater = (LayoutInflater) mContext
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                view = mInflater.inflate(R.layout.listitem, null);
                holder = new ViewHolder();
                holder.selected = (CheckBox)view.findViewById(R.id.list_select);
                holder.name = (TextView)view.findViewById(R.id.list_name);
                holder.address = (TextView)view.findViewById(R.id.list_address);
                final int p = position;
                map.put(position, view);
                holder.selected.setOnClickListener(new View.OnClickListener() {
                    
                    @Override
                    public void onClick(View v) {
                        CheckBox cb = (CheckBox)v;
                        mChecked.set(p, cb.isChecked());
                    }
                });
                view.setTag(holder);
            }else{
                Log.e("MainActivity","position2 = "+position);
                view = map.get(position);
                holder = (ViewHolder)view.getTag();
            }
            
            holder.selected.setChecked(mChecked.get(position));
            holder.name.setText(listPerson.get(position).getName());
            holder.address.setText(listPerson.get(position).getAddress());
            
            return view;
        }
        
    }
    
    static class ViewHolder{
        CheckBox selected;
        TextView name;
        TextView address;
    }
}

 

[6] 程序运行后的结果如下:

技术分享

以上是关于Android中ListView结合CheckBox判断选中项的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何在listView上的项目中结合滑动手势和长按

自定义 listView 行,带有复选框和旋转时的储蓄复选标记

Android入门第60天-MVVM中的Databinding与ListView结合使用

Android入门第60天-MVVM中的Databinding与ListView结合使用

Android ListView 全面优化

android中字母导航和PinnedHeaderListView(listview头部固定)