list_item.xml

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent" >    <ImageView        android:id="@+id/img"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentLeft="true"        android:layout_centerVertical="true"        android:layout_margin="5dp" />    <LinearLayout        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_centerVertical="true"        android:layout_toRightOf="@id/img"        android:orientation="vertical" >        <TextView            android:id="@+id/title"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:textColor="#ffffff"            android:textSize="22sp" />        <TextView            android:id="@+id/info"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:textColor="#ffffff"            android:textSize="13sp" />    </LinearLayout>    <CheckBox        android:id="@+id/check"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignParentRight="true"        android:layout_centerVertical="true"        android:clickable="false"        android:focusable="false"        android:focusableInTouchMode="false" /></RelativeLayout>

listview.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center"        android:orientation="horizontal" >        <Button            android:id="@+id/button1"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="全选" />        <Button            android:id="@+id/button2"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="取消" />        <Button            android:id="@+id/button3"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="反选" />        <TextView            android:id="@+id/totalTv"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="共选了多少个" />    </LinearLayout>    <ListView        android:id="@+id/mylistview"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:background="@android:color/white"        android:divider="@android:color/darker_gray"        android:dividerHeight="1dp"        android:fadingEdge="none"        android:scrollingCache="false" >    </ListView></LinearLayout>

ViewHolder.java

package com.wangzhu.demoselector;import android.widget.CheckBox;import android.widget.ImageView;import android.widget.TextView;public final class ViewHolder {    public ImageView img;    public TextView title;    public TextView info;    public CheckBox checkBox;}

MyAdapter.java

package com.wangzhu.demoselector;import java.util.HashMap;import java.util.List;import java.util.Map;import android.annotation.SuppressLint;import android.content.Context;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.CheckBox;import android.widget.ImageView;import android.widget.TextView;public class MyAdapter extends BaseAdapter {    private Context context;    private LayoutInflater inflater;    private List<Map<String, Object>> items;    private Map<Integer, Boolean> isSelectedMap;    public MyAdapter(Context context, List<Map<String, Object>> items) {        this.context = context;        this.items = items;        init();    }    private void init() {        Log.d("MyAdapter", "MyAdapter init");        inflater = LayoutInflater.from(context);        isSelectedMap = new HashMap<Integer, Boolean>();        for (int i = 0, size = items.size(); i < size; i++) {            isSelectedMap.put(i, false);        }    }    @Override    public int getCount() {        return items.size();    }    @Override    public Object getItem(int position) {        return items.get(position);    }    @Override    public long getItemId(int position) {        return position;    }    @SuppressLint("NewApi")    @Override    public View getView(final int position, View convertView, ViewGroup parent) {        ViewHolder viewHolder = null;        if (null == convertView) {            convertView = inflater.inflate(R.layout.list_item, null);            // convertView = inflater.inflate(R.layout.list_item_1, null);            viewHolder = new ViewHolder();            viewHolder.img = (ImageView) convertView.findViewById(R.id.img);            viewHolder.title = (TextView) convertView.findViewById(R.id.title);            viewHolder.info = (TextView) convertView.findViewById(R.id.info);            viewHolder.checkBox = (CheckBox) convertView                    .findViewById(R.id.check);            convertView.setTag(viewHolder);        } else {            viewHolder = (ViewHolder) convertView.getTag();        }        viewHolder.img.setBackgroundResource(Integer.parseInt(String                .valueOf(items.get(position).get("img"))));        viewHolder.title.setText(String.valueOf(items.get(position)                .get("title")));        viewHolder.info                .setText(String.valueOf(items.get(position).get("info")));        // 或者在list_item.xml中设置        // android:background="@drawable/list_item_bg_selector"        Log.d("MyAdapter",                "1===getView isSelected===" + convertView.isSelected()                        + "   isChecked======"                        + viewHolder.checkBox.isChecked());        viewHolder.checkBox.setChecked(isSelectedMap.get(position));        convertView.setPressed(isSelectedMap.get(position));        convertView.setSelected(isSelectedMap.get(position));        convertView.setActivated(isSelectedMap.get(position));        Log.d("MyAdapter",                "2====getView isSelected===" + convertView.isSelected()                        + "   isChecked======"                        + viewHolder.checkBox.isChecked());        // convertView        // .setBackgroundResource(R.drawable.list_item_bg_color_selector);        // convertView.setBackgroundResource(R.drawable.list_item_bg_selector);        if (isSelectedMap.get(position)) {            convertView.setBackgroundResource(R.drawable.child_list_bg_1);        } else {            convertView.setBackgroundResource(R.drawable.child_list_item);        }        return convertView;    }    public Map<Integer, Boolean> getIsSelectedMap() {        return isSelectedMap;    }}

ListViewActivity.java

package com.wangzhu.demoselector;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.Button;import android.widget.CheckBox;import android.widget.ListView;import android.widget.TextView;public class ListViewActivity extends Activity implements OnClickListener {    private final static String TAG = "ListViewActivity";    private MyAdapter myAdapter;    private ListView listView;    private Button button1, button2, button3;    private TextView totalTv;    private List<Map<String, Object>> datas;    private int count = 0;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.listview);        init();    }    private void init() {        getDatas();        button1 = (Button) findViewById(R.id.button1);        button1.setOnClickListener(this);        button2 = (Button) findViewById(R.id.button2);        button2.setOnClickListener(this);        button3 = (Button) findViewById(R.id.button3);        button3.setOnClickListener(this);        totalTv = (TextView) findViewById(R.id.totalTv);        myAdapter = new MyAdapter(getApplicationContext(), datas);        listView = (ListView) findViewById(R.id.mylistview);        listView.setAdapter(myAdapter);        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);// 多选模式        // listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);// 单选模式        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view,                    int position, long id) {                Log.d(TAG,                        "onItemClick======="                                + String.valueOf(datas.get(position).get(                                        "title")) + " position=" + position                                + " id=" + id);                ViewHolder viewHolder = (ViewHolder) view.getTag();                CheckBox checkBox = viewHolder.checkBox;                final Map<Integer, Boolean> isSelectedMap = myAdapter                        .getIsSelectedMap();                switch (listView.getChoiceMode()) {                case ListView.CHOICE_MODE_SINGLE:                    if (!isSelectedMap.get(position)) {                        checkBox.toggle();                        isSelectedMap.put(position, true);                    }                    break;                case ListView.CHOICE_MODE_MULTIPLE:                    checkBox.toggle();                    if (checkBox.isChecked()) {                        count++;                    } else {                        count--;                    }                    handler.sendEmptyMessage(0);                    if (checkBox.isChecked()) {                        view.setBackgroundResource(R.drawable.child_list_bg_1);                    } else {                        view.setBackgroundResource(R.drawable.child_list_item);                    }                    isSelectedMap.put(position, checkBox.isChecked());                    break;                default:                    break;                }            }        });    }    public void getDatas() {        datas = new ArrayList<Map<String, Object>>();        Map<String, Object> map = null;        for (int i = 0; i < 20; i++) {            map = new HashMap<String, Object>();            map.put("title", "G" + i);            map.put("info", "Google " + i);            map.put("img", R.drawable.ic_launcher);            datas.add(map);        }    }    @Override    public void onClick(View v) {        switch (v.getId()) {        case R.id.button1:            allSelected();            break;        case R.id.button2:            cancelSelected();            break;        case R.id.button3:            ReverseSelection();            break;        default:            break;        }    }    /**     * 全选     */    public void allSelected() {        final Map<Integer, Boolean> isSelectedMap = myAdapter                .getIsSelectedMap();        for (int i = 0, size = isSelectedMap.size(); i < size; i++) {            if (!isSelectedMap.get(i)) {                count++;            }            isSelectedMap.put(i, true);        }        dataChanged();    }    /**     * 取消     */    public void cancelSelected() {        final Map<Integer, Boolean> isSelectedMap = myAdapter                .getIsSelectedMap();        for (int i = 0, size = isSelectedMap.size(); i < size; i++) {            if (isSelectedMap.get(i)) {                count--;            }            isSelectedMap.put(i, false);        }        dataChanged();    }    /**     * 反选     */    public void ReverseSelection() {        final Map<Integer, Boolean> isSelectedMap = myAdapter                .getIsSelectedMap();        for (int i = 0, size = isSelectedMap.size(); i < size; i++) {            // isSelectedMap.put(i, !isSelectedMap.get(i));            if (isSelectedMap.get(i)) {                count--;                isSelectedMap.put(i, false);            } else {                count++;                isSelectedMap.put(i, true);            }        }        dataChanged();    }    public void dataChanged() {        // 自定义的BaseAdapter中调用notifyDataSetChanged方法会重新调用BaseAdapter的getView方法        myAdapter.notifyDataSetChanged();        handler.sendEmptyMessage(0);    }    public Handler handler = new Handler() {        @Override        public void handleMessage(Message msg) {            totalTv.setText("选中了" + count + "个");        }    };}

以下是本次Demo中用到的图片:

备注:欢迎各位大牛多多指教,谢谢!

更多相关文章

  1. 禁止Android的StatusBar下拉
  2. android调用系统程序
  3. Android通过WebView调用 JS 代码
  4. android 调用draw(canvas) 函数自动退出
  5. Android应用程序键盘(Keyboard)消息处理机制分析(22)
  6. android 加载模式
  7. Android(安卓)SQLite存取图像
  8. Android(安卓)唤醒锁
  9. 高斯模糊效果移植到android系统

随机推荐

  1. 在LinearLayout中实现列表,列表采用Linea
  2. 【Android开发那点破事】Android中Activi
  3. protected-broadcast 的一些细节
  4. 在Android上实现SSL握手(客户端需要密钥和
  5. Android 交互功能组件BroadcastReceiver
  6. android softap 热点配置分析
  7. 仿UCWEB自定义Menu
  8. Android ndk下用AssetManager读取assets
  9. Android之grafika源码阅读
  10. AsyncTask异步下载图片