一手遮天 Android - view(ListView): ListView 的单选和多选

一手遮天 Android - view(ListView): ListView 的单选和多选,第1张

概述项目地址https://github.com/webabcd/AndroidDemo作者webabcd一手遮天Android-view(ListView):ListView的单选和多选示例如下:/view/listview/ListViewDemo5.java/***ListView的单选和多选*booleanisItemChecked(intposition)-判断指定索引位置的item

项目地址 https://github.com/webabcd/AndroidDemo
作者 webabcd

一手遮天 AndroID - vIEw(ListVIEw): ListVIEw 的单选和多选示例如下:

/vIEw/ListvIEw/ListVIEwDemo5.java

/** * ListVIEw 的单选和多选 *     boolean isItemChecked(int position) - 判断指定索引位置的 item 是否为选中状态 *     int getCheckedItemposition() - 单选状态下,获取选中状态的 item 的索引位置 *     SparseBooleanArray getCheckedItempositions() - 多选状态下,获取选中状态的 item 的索引位置集合 *     long[] getCheckedItemIDs() - 获取选中状态的 item 的 ID 集合(此 ID 就是在 BaseAdapter 中通过 getItemID() 返回的 ID) *     int getCheckedItemCount() - 获取选中状态的 item 的总数 *     setItemChecked(int position, boolean value) - 设置指定索引位置的 item 的选中状态 *     clearChoices() - 清除全部 item 的选中状态 * * 实现多选的话,很简单,只要在 xml 中设置 ListVIEw 的 choiceMode 为 multipleChoice 即可,至于如何获取和设置 item 的选中状态只要参考上面那些 API 就好 * 但是要实现选中状态和未选中状态样式不同的话,则要稍微麻烦一点,因为在 selector 中指定 state_selected="true 的话没有效果 * 需要在 getVIEw() 的时候,根据当前 item 的选中状态来决定使用哪个 selector */package com.webabcd.androIDdemo.vIEw.ListvIEw;import androID.content.Context;import androIDx.appcompat.app.AppCompatActivity;import androID.os.Bundle;import androID.util.Log;import androID.vIEw.LayoutInflater;import androID.vIEw.VIEw;import androID.vIEw.VIEwGroup;import androID.Widget.AdapterVIEw;import androID.Widget.BaseAdapter;import androID.Widget.button;import androID.Widget.ImageVIEw;import androID.Widget.ListVIEw;import androID.Widget.TextVIEw;import androID.Widget.Toast;import com.webabcd.androIDdemo.R;import java.util.ArrayList;import java.util.List;public class ListVIEwDemo5 extends AppCompatActivity {    private final String LOG_TAG = "ListVIEwDemo5";    private ListVIEw _ListVIEw1;    @OverrIDe    protected voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentVIEw(R.layout.activity_vIEw_ListvIEw_ListvIEwdemo5);        _ListVIEw1 = (ListVIEw) findVIEwByID(R.ID.ListVIEw1);        sample();    }    private voID sample() {        // 构造数据        List<MyData> myDataList = new ArrayList<MyData>();        for (int i = 0; i < 100; i++) {            myDataList.add(new MyData(R.drawable.img_sample_son, "name " + i, "comment " + i));        }        final MyAdapter myAdapter = new MyAdapter(myDataList, this);        _ListVIEw1.setAdapter(myAdapter);        // item 被选中时触发的事件,但是实测无效        // _ListVIEw1.setonItemSelectedListener(...);        // item 的点击事件        _ListVIEw1.setonItemClickListener(new AdapterVIEw.OnItemClickListener() {            @OverrIDe            public voID onItemClick(AdapterVIEw<?> parent, VIEw vIEw, int position, long ID) {                // 每次点击 item 后,刷新 ListVIEw 以便绘制当前可见 item 的选中状态                myAdapter.notifyDataSetChanged();            }        });    }    // 自定义实体类    class MyData {        private int _logoID;        private String _name;        private String _comment;        public MyData() {        }        public MyData(int logoID, String name, String comment) {            this._logoID = logoID;            this._name = name;            this._comment = comment;        }        public int getlogoID() {            return _logoID;        }        public String getname() {            return _name;        }        public String getComment() {            return _comment;        }        public voID setlogoID(int logoID) {            this._logoID = logoID;        }        public voID setname(String name) {            this._name = name;        }        public voID setComment(String comment) {            this._comment = comment;        }    }    // 自定义 BaseAdapter    class MyAdapter extends BaseAdapter {        private List<MyData> _myDataList;        private Context _context;        public MyAdapter(List<MyData> myDataList, Context context) {            this._myDataList = myDataList;            this._context = context;        }        // 需要呈现的 item 的总数        @OverrIDe        public int getCount() {            return _myDataList.size();        }        // 返回指定索引位置的 item 的对象        @OverrIDe        public Object getItem(int position) {            return _myDataList.get(position);        }        // 返回指定索引位置的 item 的 ID        @OverrIDe        public long getItemID(int position) {            return position;        }        // 每构造一个 item 就会调用一次 getVIEw() 来获取这个 item 的 vIEw        // 每次绘制 item 都会调用 getVIEw()        @OverrIDe        public VIEw getVIEw(int position, VIEw convertVIEw, VIEwGroup parent) {            VIEwHolder holder = null;            if (convertVIEw == null) {                convertVIEw = LayoutInflater.from(_context).inflate(R.layout.item_vIEw_ListvIEw_ListvIEwdemo5, parent, false);                holder = new VIEwHolder();                holder.imglogo = (ImageVIEw) convertVIEw.findVIEwByID(R.ID.imglogo);                holder.txtname = (TextVIEw) convertVIEw.findVIEwByID(R.ID.txtname);                holder.txtComment = (TextVIEw) convertVIEw.findVIEwByID(R.ID.txtComment);                holder.button1 = (button) convertVIEw.findVIEwByID(R.ID.button1);                convertVIEw.setTag(holder); // 将 holder 保存到 convertVIEw 中                // 如果 ListVIEw 的 item 中有 button 的话,默认情况下只能响应 button 的点击事件,而 item 的点击事件将被屏蔽                // 如果需要既响应 button 的点击事件,又响应 item 的点击事件的话,则需要将 item 的 descendantFocusability 设置为 blocksDescendants(详见:item_vIEw_ListvIEw_ListvIEwdemo5.xml)                holder.button1.setonClickListener(new VIEw.OnClickListener() {                    @OverrIDe                    public voID onClick(VIEw v) {                        Toast.makeText(ListVIEwDemo5.this, "button1 clicked: " + v.getTag(), Toast.LENGTH_SHORT).show();                    }                });            } else {                holder = (VIEwHolder) convertVIEw.getTag();            }            holder.imglogo.setBackgroundResource(_myDataList.get(position).getlogoID());            holder.txtname.setText(_myDataList.get(position).getname());            holder.txtComment.setText(_myDataList.get(position).getComment());            holder.button1.setTag(position);            // 如果当前 item 是选中状态则使用选中状态下的样式和点击样式,否则使用正常(未选中)状态下的样式和点击样式            // 经测试,在 selector 中指定 state_selected="true 的话没有效果,所以就这么写了            if (_ListVIEw1.isItemChecked(position)) {                convertVIEw.setBackgroundResource(R.drawable.selector_ListvIEw_item_background_selected);            } else {                convertVIEw.setBackgroundResource(R.drawable.selector_ListvIEw_item_background_normal);            }            return convertVIEw;        }        class VIEwHolder {            ImageVIEw imglogo;            TextVIEw txtname;            TextVIEw txtComment;            button button1;        }    }}

/layout/activity_vIEw_ListvIEw_ListvIEwdemo5.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">    <!--        choiceMode - 选中模式            none - 不允许选中                对应 java 端的 setChoiceMode(ListVIEw.CHOICE_MODE_NONE)            singleChoice - 单选模式                对应 java 端的 setChoiceMode(ListVIEw.CHOICE_MODE_SINGLE)            multipleChoice - 多选模式                对应 java 端的 setChoiceMode(ListVIEw.CHOICE_MODE_MulTIPLE)            multipleChoiceModal - 多选模式(需要和 Actionbar ActionMode 配合)                对应 java 端的 setChoiceMode(ListVIEw.CHOICE_MODE_MulTIPLE_MODAL)    -->    <ListVIEw        androID:ID="@+ID/ListVIEw1"        androID:layout_wIDth="match_parent"        androID:layout_height="match_parent"        androID:choiceMode="multipleChoice"/></linearLayout>

/layout/item_vIEw_ListvIEw_ListvIEwdemo5.xml

<?xml version="1.0" enCoding="utf-8"?><!--    注:    如果 ListVIEw 的 item 中有 button 的话,默认情况下只能响应 button 的点击事件,而 item 的点击事件将被屏蔽    如果需要既响应 button 的点击事件,又响应 item 的点击事件的话,则需要将 item 的 descendantFocusability 设置为 blocksDescendants--><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"    androID:layout_wIDth="match_parent"    androID:layout_height="match_parent"    androID:paddingleft="10dp"    androID:orIEntation="horizontal"    androID:descendantFocusability="blocksDescendants">    <ImageVIEw        androID:ID="@+ID/imglogo"        androID:layout_wIDth="64dp"        androID:layout_height="64dp" />    <linearLayout        androID:layout_wIDth="match_parent"        androID:layout_height="wrap_content"        androID:orIEntation="vertical"        androID:layout_weight="1">        <TextVIEw            androID:ID="@+ID/txtname"            androID:layout_wIDth="wrap_content"            androID:layout_height="wrap_content"            androID:textcolor="#1D1D1D"            androID:textSize="24sp" />        <TextVIEw            androID:ID="@+ID/txtComment"            androID:layout_wIDth="wrap_content"            androID:layout_height="wrap_content"            androID:textcolor="#B4B4B4"            androID:textSize="14sp" />    </linearLayout>    <button        androID:ID="@+ID/button1"        androID:layout_wIDth="wrap_content"        androID:layout_height="wrap_content"        androID:text="按钮 1"/></linearLayout>

/drawable/selector_ListvIEw_item_background_selected.xml

<?xml version="1.0" enCoding="utf-8"?><selector xmlns:androID="http://schemas.androID.com/apk/res/androID">    <!--        注意:        1、selector 是按照顺序匹配状态的,先匹配到哪个就用哪个。比如一个控件既是 state_enabled="false" 又是 state_pressed="false",那么就看哪个状态的定义靠前就用哪个状态的样式        2、一个 item 是可以有多个 state 的    -->    <!--        本例用于指定 ListVIEw 的 item 在选中状态下的样式和点击样式    -->    <!--点击样式-->    <item androID:state_pressed="true">        <shape>            <solID androID:color="@color/green" />            <stroke androID:wIDth="1dp" androID:color="@color/blue" />            <corners androID:radius="1dp" />        </shape>    </item>    <!--默认样式-->    <item>        <shape>            <solID androID:color="@color/orange" />        </shape>    </item></selector>

/drawable/selector_ListvIEw_item_background_normal.xml

<?xml version="1.0" enCoding="utf-8"?><selector xmlns:androID="http://schemas.androID.com/apk/res/androID">    <!--        注意:        1、selector 是按照顺序匹配状态的,先匹配到哪个就用哪个。比如一个控件既是 state_enabled="false" 又是 state_pressed="false",那么就看哪个状态的定义靠前就用哪个状态的样式        2、一个 item 是可以有多个 state 的    -->    <!--        本例用于指定 ListVIEw 的 item 在正常(未选中)状态下的样式和点击样式    -->    <!--点击样式-->    <item androID:state_pressed="true">        <shape>            <solID androID:color="@color/green" />            <stroke androID:wIDth="1dp" androID:color="@color/blue" />            <corners androID:radius="1dp" />        </shape>    </item>    <!--默认样式-->    <item>        <shape>            <solID androID:color="@color/wheat" />        </shape>    </item></selector>

项目地址 https://github.com/webabcd/AndroidDemo
作者 webabcd

总结

以上是内存溢出为你收集整理的一手遮天 Android - view(ListView): ListView 的单选和多选全部内容,希望文章能够帮你解决一手遮天 Android - view(ListView): ListView 的单选和多选所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/999655.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存