概述
在使用列表显示数据时,特别如GridView显示表格式数据时,经常需要多选文件进行操作,移动端一般为长按弹出选择模式并调出操作栏,然后多选后执行操作栏的相关功能。
首先,改写数据类
public Boolean isShowSelected;
public Boolean isSelected;
在数据类中增加以上两个字段,用来控制列表项是否显示选择框,以及是否选中的状态,方便后续操作。
然后,Item中增加选择框的图片
要准备两张图片供切换,一个为选中状态,一个为未选中状态
我这里参考常见相册选择状态,又增加一个View用来显示半透明遮罩,更清晰的显示选中状态
<View
android:id="@+id/item_recent_album_shade"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#88FFFFFF"
android:translationZ="2dp"
android:visibility="gone" />
<ImageView
android:id="@+id/item_recent_album_check"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginEnd="4dp"
android:src="@drawable/btn_check_off_focused_holo_light"
android:translationZ="3dp"
android:visibility="gone" />
然后,Adapter增加选择模式的判断
首先判断当前项是否需要显示选择框,如果需要,再根据当前选中状态显示相应的图片提示,
如:是否显示遮罩层,切换选择框图片为选中状态的图片等你喜欢的样式定制
// 选择框
if (albumBean.isShowSelected) {
mView.itemRecentAlbumCheck.setVisibility(View.VISIBLE);
if (albumBean.isSelected) {
mView.itemRecentAlbumShade.setVisibility(View.VISIBLE);
Glide.with(mContext).load(R.drawable.btn_check_on_holo_light).into(mView.itemRecentAlbumCheck);
} else {
mView.itemRecentAlbumShade.setVisibility(View.GONE);
Glide.with(mContext).load(R.drawable.btn_check_off_focused_holo_light).into(mView.itemRecentAlbumCheck);
}
} else {
mView.itemRecentAlbumCheck.setVisibility(View.GONE);
}
最后,Activity中代码控制
定义一个控制变量
所有的操作都是基于此控制变量来判断是否处理选择模式下进行操作
private Boolean isSelectedState = false;
控制显示样式
正常长按进入选择模式,设定值为true
返回退出选择模式,设定值为false
//取消选择状态
private void closeSelected() {
isSelectedState = false;
mView.rgpAlbumCtl.setVisibility(View.GONE);
if (lstAlbums.size() > 0) {
for (AlbumBean album : lstAlbums) {
album.isShowSelected = false;
album.isSelected = false;
}
albumAdapter.notifyDataSetChanged();
}
}
//进入选择状态
private void openSelected() {
isSelectedState = true;
mView.rgpAlbumCtl.setVisibility(View.VISIBLE);
for (AlbumBean album : lstAlbums) {
album.isShowSelected = true;
album.isSelected = false;
}
}
相关位置的控制代码
返回
@Override
public void onBackPressed() {
if (isSelectedState) closeSelected();
else super.onBackPressed();
}
Item项长按
private class ItemLongClickListener implements AdapterView.OnItemLongClickListener {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
if (!isSelectedState) openSelected();
//当前item选中状态
lstAlbums.get(position).isSelected = true;
albumAdapter.notifyDataSetChanged();
return true;
}
}
Item项单击
private class ItemClickListener implements AdapterView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (isSelectedState) {
lstAlbums.get(position).isSelected = !lstAlbums.get(position).isSelected;
albumAdapter.notifyDataSetChanged();
} else {
// 执行正常单击打开之类的动作
}
}
}
最最后编写相应的控制按钮的事件功能即可
记得点击完按钮,退出选择模式