废话不多说,直接上代码!(最后有成品效果图)
1.Layout 布局,只用一个 listview 就行
<RelativeLayout android:layout_width="match_parent" android:layout_height="@dimen/dp_200"> <ListView android:id="@+id/lv_dxtx" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:divider="@null" android:scrollbars="none" /> </RelativeLayout>
2.listview 的item 布局,里面有负责展示选中和为选中状态的 imageview,和展示文本内容的 TextView
<?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"> <View android:layout_width="match_parent" android:layout_height="@dimen/dp_1" android:alpha="0.5" android:background="@color/et_hint_color"/> <LinearLayout android:id="@+id/ll_item_extx" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="@dimen/dp_10" android:orientation="horizontal"> <ImageView android:id="@+id/iv_dxtx_ischeck" android:layout_width="20dp" android:layout_height="20dp" android:src="@mipmap/dxtxed" android:layout_gravity="center_vertical" /> <TextView android:id="@+id/tv_dxtx_item" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="@dimen/dp_8" android:text="张三" android:layout_gravity="center_vertical" android:textSize="@dimen/sp_16"/> </LinearLayout> </RelativeLayout>
3.ListView适配器
package com.example.documenttransfer.adapter; import android.app.Activity; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; import com.example.documenttransfer.R; import java.util.List; import java.util.Map; /** * 选择收信人适配器 */ public class DxtxListview_Adapter extends BaseAdapter { private List<Map<String, String>> mapList; private Activity mContext; private ListView listView; public DxtxListview_Adapter(Activity context, List<Map<String, String>> mapList, ListView listView) { this.mapList = mapList; this.mContext = context; this.listView = listView; } @Override public int getCount() { return mapList.size(); } @Override public Object getItem(int position) { return mapList.get(position); } @Override public long getItemId(int position) { return position; } @Override public boolean hasStableIds() {//这个需要return true ! getCheckedItemIds 才会有作用 return true; } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; // 若无可重用的 view 则进行加载 if (convertView == null) { // 初始化 ViewHolder 方便重用 viewHolder = new ViewHolder(); convertView = View.inflate(mContext, R.layout.dialog_item_dxtx, null); viewHolder.iv_dxtx_ischeck = convertView.findViewById(R.id.iv_dxtx_ischeck); viewHolder.tv_dxtx_item = convertView.findViewById(R.id.tv_dxtx_item); convertView.setTag(viewHolder); } else { // 否则进行重用 viewHolder = (ViewHolder) convertView.getTag(); } viewHolder.tv_dxtx_item.setText(mapList.get(position).get("item"));//收件人姓名赋值 if (listView.isItemChecked(position)) {//判断 item 是否被选中,根据选中状态设置对应图标 viewHolder.iv_dxtx_ischeck.setImageResource(R.mipmap.dxtxed);//选中 } else { viewHolder.iv_dxtx_ischeck.setImageResource(R.mipmap.dxtx);//未选中 } return convertView; } /** * 自定义的ViewHolder */ class ViewHolder { private ImageView iv_dxtx_ischeck;//选中、为选中的图标 private TextView tv_dxtx_item;//收件人姓名 } }
4.Activity
private List<Map<String, String>> mapLists = new ArrayList<>();//数据源集合 private Map<String, String> map;//数据源 private ListView lv_dxtx;// listview列表 private DxtxListview_Adapter dxtxListview_adapter;//适配器
private void initView(){
//添加测试数据
for (int i = 0; i < 6; i++) {
map = new HashMap<>();
map.put("item", "张三" + i); mapLists.add(map);
}
lv_dxtx = findViewById(R.id.lv_dxtx); lv_dxtx.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);//设置 listview 模式为多选
//初始化适配器 dxtxListview_adapter = new DxtxListview_Adapter(this, mapLists, lv_dxtx); lv_dxtx.setAdapter(dxtxListview_adapter);//Listview设置适配器 lv_dxtx.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { dxtxListview_adapter.notifyDataSetChanged(); } });
}
5.获取(多选后)数据(通过 listview 的checkedItemIds方法获取所选下标,然后根据下标去数据源里获取数据)
获取所选数据方法(一般放到点击事件,点击的时候获取多选的数据)
//获取选中数据的下标,根据选中的下标把对应数据取出来 long[] checkedItemIds = lv_dxtx.getCheckedItemIds(); for (int i = 0; i< checkedItemIds.length;i++){ Log.e("dataTag","下标:"+checkedItemIds[i]+" 所选数据:"+mapLists.get((int) checkedItemIds[i]).get("item")); }
6.最终效果图
ok 搞定!上述这些就是 listview 子项多选并获取所选数据的所有代码,希望对大家的工作或学习有所帮助。