一手遮天 AndroID - vIEw(ListVIEw): ListVIEw 的单选和多选示例如下:项目地址 https://github.com/webabcd/AndroidDemo
作者 webabcd
/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 的单选和多选所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)