问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何通过ListView实现多选效果

发布网友 发布时间:2022-04-20 03:13

我来回答

1个回答

热心网友 时间:2023-09-05 18:54

一.无图无* 


二.关键代码 
1.主布局 sample_main.xml(单选和多选切换,设置android:choiceMode,其他不变)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:showDividers="middle"
android:divider="?android:dividerHorizontal">

<TextView style="@style/Widget.DescriptionBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/intro_message" />

<!--
当 ListView 已设置 choiceMode 时,它将允许用户"选择"
一个或多个项目。该框架提供了默认列表项目布局,这显示标准单选按钮或复选框旁边
单行文本:
《 android:choiceMode="singleChoice"》
R.layout.simple_list_item_single_choice 和
《  android:choiceMode="multipleChoice"》
R.layout.simple_list_item_multiple_choice。
应该设置 android: scrollbarStyle (显示和隐藏)
android:scrollbarStyle="outsideInset"不显示
android:scrollbarStyle="insideOverlay"显示
-->
<ListView android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:paddingLeft="@dimen/page_margin"
android:paddingRight="@dimen/page_margin"
android:scrollbarStyle="outsideInset"
android:choiceMode="multipleChoice" /></LinearLayout>123456789101112131415161718192021222324252627282930313233

2.item布局

<!--
从 sample_main.xml ListView 有 choiceMode 套,意思说当用户
选择列表项,列表视图将设置为该项目的根视图状态
(此 CheckableLinearLayout)"检查"。请注意,这需要查看
实现的接口。一旦选中根视图,则任何item,
有 plicateParentState 属性设置的将继承此"选中"状态.
--><com.example.android.customchoicelist.CheckableLinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingLeft="8dp"
android:id="@+id/ll_contain"
android:paddingRight="8dp"
android:minHeight="?android:listPreferredItemHeight"
android:gravity="center_vertical">

<TextView android:id="@android:id/text1"
android:plicateParentState="true"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:textAppearance="?android:textAppearanceMedium"
android:textColor="@color/hideable_text_color" />

<ImageView android:src="@drawable/ic_hideable_item"
android:plicateParentState="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp" /></com.example.android.customchoicelist.CheckableLinearLayout>12345678910111213141516171819202122232425262728293031323334

3.自定义单选和多选布局

package com.example.android.customchoicelist;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.View;import android.widget.Checkable;import android.widget.LinearLayout;/**
*自定义单选和多选布局
*/public class CheckableLinearLayout extends LinearLayout implements Checkable {
private static final int[] CHECKED_STATE_SET = {android.R.attr.state_checked};    private boolean mChecked = false;    public CheckableLinearLayout(Context context, AttributeSet attrs) {        super(context, attrs);
}    //返回选中的状态
public boolean isChecked() {        return mChecked;
}    //设置选中的状态
public void setChecked(boolean b) {        if (b != mChecked) {
mChecked = b;
refreshDrawableState();
}
}    //选择开关
public void toggle() {
setChecked(!mChecked);
}    //添加选中的条目状态
@Override
public int[] onCreateDrawableState(int extraSpace) {        final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);        if (isChecked()) {
mergeDrawableStates(drawableState, CHECKED_STATE_SET);
}        return drawableState;
}
}123456789101112131415161718192021222324252627282930313233343536373839404142434445

4.主要代码MainActivity.java

package com.example.android.customchoicelist;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;/**
*如何创建自定义的单或多选择
* @author  孤狼
* @since  2015-8-3
*/public class MainActivity extends Activity {
ListView listView;    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);
setContentView(R.layout.sample_main);
listView =(ListView)findViewById(R.id.listview);
listView.setAdapter(new MyAdapter());
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {            @Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                //获取条目
CheckableLinearLayout linearLayout = (CheckableLinearLayout) view.findViewById(R.id.ll_contain);                if (linearLayout.isChecked()) {
Log.e("选中true", position + "");
} else {
Log.e("未选中false", position + "");
}                /**对于多选,建议创建集合,用于封装用户选中的条目position,存入时判定                     用户来回切换的状态*/
}
});
}    /**
* A simple array adapter that creates a list of cheeses.
*/
private class MyAdapter extends BaseAdapter {
@Override
public int getCount() {            return Cheeses.CHEESES.length;
}        @Override
public String getItem(int position) {            return Cheeses.CHEESES[position];
}        @Override
public long getItemId(int position) {            return Cheeses.CHEESES[position].hashCode();
}        @Override
public View getView(int position, View convertView, ViewGroup container) {            if (convertView == null) {
convertView = getLayoutInflater().inflate(R.layout.list_item, container, false);
}
((TextView) convertView.findViewById(android.R.id.text1))
.setText(getItem(position));            return convertView;
}
}
}123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172

三.说明 
通篇没有多余的废话,不浪费大家的宝贵时间,代码简洁,主要部分都有注释,实际开发中的需求,需要牛牛们自己自定义,发挥,如有疑问,请留言—-孤狼

四.示例源码(由于孤狼使用的是Android studio开发,暂时没有eclipse版)

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
茶映人生:苦尽甘来 海尔冰箱冷藏室和冷冻室都是空空的通上电工作会更耗电吗? 上菱冰箱用过7年了,1米5高有点大,我每天冰箱里面只冻半斤肉,冷藏室其它... 结婚前个人的保险结婚后转成存单是属于个人财产还是夫妻双方的财产_百 ... 六个月宝宝大便水样蛋花怎么办 宝宝拉蛋花样便怎么办 ...张仙亲送玉麒麟,一家老少皆欢喜,祖德宗功信可凭。 我见青山多妩媚,料青山见我应如是意思 料青山见我应如是的意思_百度知... 电脑导航用哪个比较好电脑用什么网址导航哪个更好用 电脑看地图哪个好电脑上的哪个地图软件好 请问demand deposits 和 checking account 的区别 什么是支票账户 CHECK啥意思 ch开头,后面有个k,大约9个字母的单词 Qt中click和click这两个信号有什么区别 android中menu怎么写 qt中clicked和toggled的区别 Checkable deposits求翻译 安卓中有一个setGroupCheckable方法什么意思 check怎翻译 请问尾音发ble的单词有哪些? check 阿是及物动词.? 花店的开办费有哪些 开个花店要多少钱 开花店需要怎么开?一般成本多少钱? 开花店的费用有哪几项,每项的大概金额是多少? 想投资,开个花店。得多少钱呢? 开花店需要什么证件?及大概投入? 如果想开一家花店大约需要多少钱? 如果在郑州开花店需要投入多少资金呢?还有进货时... 求助setChecked和setCheckable区别 android列举selector标签常用到属性,并说明分别代... qt中tableview怎么添加checkbox javascript框架jquery ztree中的simpledata参数是... ath新高缩写 灏字取名的寓意是什么? 带灏字的男孩名字 颢宸在名字中怎么解释 带宸字的男孩名字(霸气、嚣张一点的)写小说的 明宸和明灏哪个名字好 冯宸后面加个什么字好 姓王属虎取名王宸灏好吗 男孩取名字 范姓霸气名字有哪些? 赵宸灏这个名字好吗?男孩 华为nova3和nova3i有什么区别?哪一款时候游戏和商务? 美团外卖点餐却被骑手拿走菜品,平台怎么处理? 美团就“小哥偷吃外卖”致歉,你认为类似事件只是个... 美团送餐员偷百度外卖配餐,你怎么看? 深圳男子冒充外卖小哥偷外卖吃,该男子是怎样进行...