Android列表GridView定制长按弹出选择模式

概述

在使用列表显示数据时,特别如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 {
                // 执行正常单击打开之类的动作
            }
        }
    }

最最后编写相应的控制按钮的事件功能即可

记得点击完按钮,退出选择模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值