Android ListView 子项多选并获取多选数据

废话不多说,直接上代码!(最后有成品效果图)

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 子项多选并获取所选数据的所有代码,希望对大家的工作或学习有所帮助。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值