ListView 实现多选/单选

ListView自身带了单选、多选模式,可通过listview.setChoiceMode来设置:

listview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);//开启多选模式

listview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);//开启单选模式

listview.setChoiceMode(ListView.CHOICE_MODE_NONE);//默认模式

listview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);//没用过,不知道用来干嘛的

实现单选

需要设置:listview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

ListView控件还需要指定一个selector: android:listSelector="@drawable/checkable_item_selector"

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@color/c1" android:state_pressed="true"/>
    <item android:drawable="@color/c1" android:state_checked="true"/>
    <item android:drawable="@color/c2"/>
</selector>

但是单选选中时的颜色还是系统选中的颜色,而不是自己设定的c1,不知道为什么?

实现多选

设置:listview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

需要对每个item的view实现Checkable接口,以下是LinearLayout实现Checkable接口:

public class CheckableLinearLayout extends LinearLayout implements Checkable {
    private boolean mChecked;
    public CheckableLinearLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    @Override
    public void setChecked(boolean checked) {
        mChecked = checked;
        setBackgroundDrawable(checked ? new ColorDrawable(0xff0000a0) : null);//当选中时呈现蓝色
    }
    @Override
    public boolean isChecked() {
        return mChecked;
    }
    @Override
    public void toggle() {
        setChecked(!mChecked);
    }
}

如下使用:

<com.ljfbest.temp.CheckableLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:minHeight="?android:attr/listPreferredItemHeightSmall"
        android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
        android:paddingStart="?android:attr/listPreferredItemPaddingStart"
        android:textAppearance="?android:attr/textAppearanceListItemSmall" />
</com.ljfbest.temp.CheckableLinearLayout>

以下附上demo图:

                                   

以下是几个获取/设置 选中条目信息的API:

listview.getCheckedItemCount();//获取选中行数:对CHOICE_MODE_NONE无效

listview.getCheckedItemPosition();//获取选中的某行,只针对单选模式有效,返回int

listview.getCheckedItemIds();//获取选中条目的ids,是long[]类型,注意需要adapter的hasStableIds()返回true,并且这些id是adapter的getItemId(int position)返回的.demo中有演示

listview.setItemChecked(position, value);//设置某行的状态

另外,使用ListView时可能会报以下错误:

java.lang.ClassCastException: android.widget.HeaderViewListAdapter cannot be cast to android.widget.SimpleAdapter

ListView有headerView/footerView时,它的原来的Adapter会被封装一下成为HeaderViewListAdapter:

ListAdapter used when a ListView has header views. This ListAdapter wraps another one and also keeps track of the header views and their associated data objects.

This is intended as a base class; you will probably not need to use this class directly in your own code.

可通过以下方式获取原来的Adapter:

HeaderViewListAdapter hAdapter = (HeaderViewListAdapter) listview.getAdapter();

MyAdapter my = ( MyAdapter) hAdapter.getWrappedAdapter();

所以,当增加一条header/footer时lv_data.getAdapter()).getWrappedAdapter().getCount()与((HeaderViewListAdapter)listview.getAdapter()).getWrappedAdapter().getCount()是相差1的

Demo地址:

http://download.csdn.net/detail/ljfbest/8109731

时间: 2024-08-08 05:38:31

ListView 实现多选/单选的相关文章

ListView 的多选模式

昨天晚上熬粥,设定六个小时之后熬一个小时的,不知为什么后来变成一个小时之后熬了六个小时,今天早饭就只好改吃锅巴了. 在<ListView的单选模式>中,已经知道ListView有多选模式的,事实上我喜欢的作家也不只一个.ListView的多选模式起初写得比较简单,从中便发现了一些问题. 先看一下布局文件,几乎和先前没怎么变化,只是改掉了ListView的模式而已. <LinearLayout xmlns:android="http://schemas.android.com/a

Android ListView条目全选功能,不用checkbox实现!

大家好,翻了翻以前的笔记,发现了一个我特别标记的功能,那就是ListView全选功能,顿时想起了我那个时候苦逼的生涯,由于我大学机械出身,大学毕业了都不知道什么叫代码,在58干了一段销售.实在是干不下去了,不干了就得在网上找工作,就喜欢干电脑相关的工作,有一天,一家培训机构给我打来电话让我去面试,我以为让我去工作那,谁知道是忽悠我去培训,我当然不可能花钱了,就直接回去了,想了几天,除了销售我真不知道干啥,咬咬牙,就花钱培训了.我擦,咋说这到了,不跟你们说了,还是写下面的这个功能吧,虽然很简单,但

IOS多选单选相册图片

IOS多选单选相册图片 之前做项目让实现多选相册的图片,自己写了一个demo一直保存在电脑上,今天下午发现电脑128G的容量已经快没有了,准备清理电脑,所以把之前做的一些demo放在博客上,以后方便用. 1.首先准备3个图片 2.定义单元格PhoCollectionViewCell #import <UIKit/UIKit.h> typedef void(^SelectBtnClickBlock) (BOOL isSelect); @interface PhoCollectionViewCel

WPF DataGrid ListView 等等 改变 选中行 颜色;以及 不变的原因

WPF中改变选中行的颜色是很简单的,就是用触发器:比如:以DataGrid为例: DataGrid.RowStyle Style TargetType= DataGridRow SetterProperty= Background Value= White / Style .Triggers TriggerProperty= IsMouseOver Value= True SetterProperty= Background Value= LightGray / /Trigger Trigger

ListView 自定义BaseAdapter实现单选打勾(无漏洞)

最近因为一个项目的原因需要自定义一个BaseAdapter实现ListVIew单选打勾的功能,虽然听起来很简单,我在网上也 看过一些例子,似乎是实现了,但往往存在一些漏洞.往往漏洞如下 1.网上例子item较少,item增多时漏洞出现,忽略了BaseAdapter中getView()方法中convertView重用的问题 2.忽略了BaseAdapter中getView()方法并不是一下子加载完所有item,上下拖动listview时item会重新加载,getview会重新被调用,所以上下拖动的

Android在listview添加checkbox实现单选多选操作问题

android根据View的不同状态更换不同的背景http://www.eoeandroid.com/thread-198029-1-1.html android 模仿朋友网推出的菜单效果[改进版]http://www.eoeandroid.com/thread-198019-1-1.html 让服务器iis支持.apk文件下载的设置方法http://www.eoeandroid.com/thread-198033-1-1.html 在 android 某些开发需求当中,有时候需要在listve

Android在listview添加checkbox实现单选多选操作问题(转)

转自:http://yangshen998.iteye.com/blog/1310183 在Android某些开发需求当中,有时候需要在listveiw中加入checkbox实现单选,多选操作.表面上看上去只是改变checkbox那么简单,然而实际开发中,实现起来并不是那么得心应手.尤其当listview比较多(比如屏幕最多只能显示10个item,但总共有12个item,也就是说listview的item数大于屏幕能够显示的item数)滑动屏幕的时候,由于适配器中getview()会重复使用被移

【转】Android 带checkbox的listView 实现多选,全选,反选 -- 不错

原文网址:http://blog.csdn.net/onlyonecoder/article/details/8687811 Demo地址(0分资源):http://download.csdn.net/detail/onlyonecoder/5154352 由于listview的一些特性,刚开始写这种需求的功能的时候都会碰到一些问题,重点就是存储每个checkbox的状态值,在这里分享出了完美解决方法: 布局文件: [html] view plaincopy <?xml version="

Android 带checkbox的listView 实现多选,全选,反选 简易版

activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" a