可拖曳的多选listView

这篇博客介绍了如何在Android中实现一个可拖曳并具有多选功能的ListView。作者通过学习他人博客,结合具体设计需求,对ListView进行设置,包括在布局文件中设定`android:choiceMode="multipleChoice"`,在itemView中使用CheckedTextView,并自定义图片和selector来改变选中状态。为了实现选中功能,CheckedTextView需要放在实现了Checkable接口的布局中。最后,博主分享了如何在用户选中多个条目后,通过删除按钮移除选中的ListView项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

纪录一下做这个功能的小知识,由于都是通过别人博客学习使用的,所以直接上链接,看完下面两篇文章大家就肯定会用了
ListView的多选模式
可拖拽listview基本使用技巧(DragSortListView)
下面是我根据这两篇文章和我们的设计需求做的一些改变的小结
在listview布局文件中设置了 android:choiceMode=”multipleChoice”
由于我们的要求是有选中按钮的,所以在listview的itemview中使用了CheckedTextView,有选中图标,也可添加文字

    <CheckedTextView
        android:id="@+id/editport_item_check"
        android:checkMark="?android:attr/listChoiceIndicatorMultiple"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:gravity="center_vertical"
        android:layout_centerVertical="true"
        android:paddingLeft="8dp" />

在listview的adpter中设置了自定义的图片

            holder.check.setCheckMarkDrawable(R.drawable.checkedview);

其中checkedview是自定义的selector,这样就可以改变选中和未选中的图片了

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:drawable="@drawable/edit_choosed"/>
    <item android:drawable="@drawable/edit_choose"/> 
</selector>

上面的代码虽然可以显示了选择框的样子,但是点击时却不能选中,在DragSortListView的demo中有一个可以多选的例子,对比并验证了一下,发现需要将CheckedTextView放到实现了Checkable接口的布局中才能够被选中。

package com.mulity.list;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.Checkable;
import android.widget.RelativeLayout;

public class CheckableRelativeLayout extends RelativeLayout implements Checkable {

    private static final int CHECKABLE_CHILD_INDEX = 0;//设置可以选中包含的第一个控件,所有在布局中CheckedTextView需要为它的第一个孩子
    private Checkable child;

    public CheckableRelativeLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        child = (Checkable) getChildAt(CHECKABLE_CHILD_INDEX);
    }

    @Override
    public boolean isChecked() {
        return child.isChecked(); 
    }

    @Override
    public void setChecked(boolean checked) {
        child.setChecked(checked);
    }

    @Override
    public void toggle() {
        child.toggle();
    }

}

现在已经完成了界面的多选功能,我使用的场景是当选中多个后点击删除按钮就将选中的项从listview中移除,因为在activity中不能获得选中的集合,所以需要循环依次判断

//获取选中位置
        data = adapter.getDatas();
        if(null == deleteList){
            deleteList=new ArrayList<CapitalSymbol>();
        }
        if(null != data){
            int num= data.size();
            for(int i=0;i<num;i++){
                if(mListView.isItemChecked(i)){//如果被选中
                    deleteList.add(data.get(i));
                    System.out.println("delete---->"+data.get(i).getSymbol());
                }
            }
        }
        //删除
        deleteNum=deleteList.size();
        if(deleteNum>0){
            //从显示列表中移除
            for(int i=0;i<deleteNum;i++){
                data.remove(deleteList.get(i));
            }
            mListView.clearChoices();//清除所有的选中状态
            adapter.updateAdapterDatas(data);
        }else{
            ToastUtils.showShort(this,R.drawable.toast_symbol_warn,"请选择要删除的项");
        }

这样我的可爱的多选可拖拽listview就完整啦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值