纪录一下做这个功能的小知识,由于都是通过别人博客学习使用的,所以直接上链接,看完下面两篇文章大家就肯定会用了
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就完整啦