RecyclerView实现手势滑动选中相册图片

要使用RecyclerView实现手势滑动选中相册图片的功能,你需要以下几个步骤:
创建含有图片资源的ViewHolder,继承自RecyclerView.ViewHolder,用于显示相册中的每个图片。
创建一个Adapter,继承自RecyclerView.Adapter,负责提供数据给ViewHolder。
在Adapter中创建一个内部类ViewHolder,用于实例化及绑定每个图片的视图。
实现ItemTouchHelper,它提供了滑动和拖放手势的回调接口。
在ItemTouchHelper的onMove方法中处理图片的交换逻辑。
 

图片适配器

public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ImageViewHolder> {private List<AlbumImage> imageList;private OnItemClickListener onItemClickListener;public ImageAdapter(List<AlbumImage> imageList) {this.imageList = imageList;}@NonNull@Overridepublic ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.album_image_item, parent, false);return new ImageViewHolder(view);}@Overridepublic void onBindViewHolder(@NonNull ImageViewHolder holder, int position) {AlbumImage image = imageList.get(position);holder.bind(image);}@Overridepublic int getItemCount() {return imageList.size();}public class ImageViewHolder extends RecyclerView.ViewHolder {private ImageView imageView;public ImageViewHolder(@NonNull View itemView) {super(itemView);imageView = itemView.findViewById(R.id.imageView);}public void bind(AlbumImage image) {imageView.setImageResource(image.getImageResourceId());}}public interface OnItemClickListener {void onItemClick(AlbumImage image);}public void setOnItemClickListener(OnItemClickListener onItemClickListener) {this.onItemClickListener = onItemClickListener;}
}

相册图片实体类:

public class AlbumImage {private int imageResourceId;public AlbumImage(int imageResourceId) {this.imageResourceId = imageResourceId;}public int getImageResourceId() {return imageResourceId;}
}

布局文件:

<androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent" />

主Activity:

public class MainActivity extends AppCompatActivity {RecyclerView recyclerView;ImageAdapter imageAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);recyclerView = findViewById(R.id.recyclerView);List<AlbumImage> imageList = new ArrayList<>();imageList.add(new AlbumImage(R.drawable.image1));imageList.add(new AlbumImage(R.drawable.image2));imageList.add(new AlbumImage(R.drawable.image3));imageAdapter = new ImageAdapter(imageList);recyclerView.setAdapter(imageAdapter);ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelperCallback(imageAdapter));itemTouchHelper.attachToRecyclerView(recyclerView);imageAdapter.setOnItemClickListener(new ImageAdapter.OnItemClickListener() {@Overridepublic void onItemClick(AlbumImage image) {Toast.makeText(MainActivity.this, "Selected Image: " + image.getImageResourceId(), Toast.LENGTH_SHORT).show();}});}private static class ItemTouchHelperCallback extends ItemTouchHelper.Callback {private ImageAdapter adapter;ItemTouchHelperCallback(ImageAdapter adapter) {this.adapter = adapter;}@Overridepublic boolean isLongPressDragEnabled() {return true;}@Overridepublic int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;return makeMovementFlags(dragFlags, swipeFlags);}@Overridepublic boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {int fromPosition = viewHolder.getAdapterPosition();int toPosition = target.getAdapterPosition();if (fromPosition < toPosition) {for (int i = fromPosition; i < toPosition; i++) {Collections.swap(adapter.imageList, i, i + 1);}} else {for (int i = fromPosition; i > toPosition; i--) {Collections.swap(adapter.imageList, i, i - 1);}}adapter.notifyItemMoved(fromPosition, toPosition);return true;}@Overridepublic void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {int position = viewHolder.getAdapterPosition();adapter.imageList.remove(position);adapter.notifyItemRemoved(position);}@Overridepublic void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {viewHolder.itemView.getBackground().setColorFilter(Color.LTGRAY, PorterDuff.Mode.MULTIPLY);} else if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {viewHolder.itemView.getBackground().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY);} else {viewHolder.itemView.getBackground().clearColorFilter();}super.onSelectedChanged(viewHolder, actionState);}}
}

基本的实现流程:

1、创建了一个ImageAdapter,它包含一个AlbumImage的列表。在每个AlbumImage类中,我们有imageResourceId,它是图片的资源ID。ImageViewHolder类是RecyclerView.ViewHolder的一个内部类,它绑定每个图片视图。

2、ItemTouchHelperCallback类扩展了ItemTouchHelper.Callback,它处理滑动和拖动手势。在onMove方法中,我们交换了ImageAdapter中的AlbumImage对象,以确保视图反映底层数据的变化。在onSwiped方法中,我们从ImageAdapter的列表中移除项目并通知适配器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/866969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

建智慧医院核心:智能导航系统的功能全析与实现效益

在数字化转型的浪潮中&#xff0c;智慧医院的建设是医疗行业数字化转型的关键步骤。随着医院规模的不断扩大和医疗设施的日益复杂&#xff0c;传统的静态不连续的导航方式已无法满足患者的需求。院内智能导航系统&#xff0c;作为医疗数字化转型的关键组成部分&#xff0c;正逐…

怎么做IDS,入侵检测

要在Linux系统上实现入侵检测系统&#xff08;IDS&#xff09;&#xff0c;您可以选择许多开源或商业工具。以下是使用开源工具Snort和Suricata来实施入侵检测系统的详细步骤&#xff1a; 选择IDS工具 1. Snort Snort是一款流行的开源网络入侵检测和防御系统&#xff08;IDS…

禅心驭智,展望软件未来新纪元

禅心驭智&#xff0c;展望软件未来新纪元 阿弥陀佛&#xff0c;善哉善哉。于这瞬息万变的数字时代&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;如同璀璨星辰&#xff0c;引领着软件开发领域步入一个前所未有的新纪元。贫僧观此变革&#xff0c;心中满是感慨与期待…

freemarker取值使用

格式化 格式化为字符串 ${entity.name!} 格式化为数字 ${entity.id?c} 格式化为时间 ${detail.date?string("yyyy-MM-dd HH:mm:ss")} 格式化为金额 判断非空 <#if detail.aEntity?? && detail.aEntity.has?? && detail.aEntity.has1>-- …

进程监视器,进程资源管理器

进程资源管理器 - Sysinternals | Microsoft Learn 进程监视器 - Sysinternals | Microsoft Learn PC查看资源占用

环境检测聚四氟乙烯微波消解罐 特氟龙反应釜 适用于COD测定

COD消解罐是实验室中用于测定水样中化学需氧量&#xff08;Chemical Oxygen Demand&#xff0c;简称COD&#xff09;的一种专用设备。化学需氧量是衡量水体污染程度的一个重要参数&#xff0c;它表示在一定条件下&#xff0c;水样中的有机物质和部分无机物质被氧化的程度。以下…

中霖教育:二建报名成功后怎么审核?

【中霖教育怎么样】【中霖教育靠谱吗】 在成功完成二级建造师资格考试的报名流程后&#xff0c;需要准备后续的审核阶段&#xff0c;审核是否通过关乎考生是否能顺利参加考试&#xff0c;审核的方式包括&#xff1a;现场审核、网络审核以及考试后的审核。 某些地区会要求考生…

AI文字图片人脸生成原创视频文生图生肖生小程序开发

AI文字图片人脸生成原创视频文生图生肖生小程序开发 无限开 0.12生成 图生视频 AI技术在生成文字、图片、人脸以及视频方面已经取得了显著的进步。以下是一些可能包含在AI文字图片人脸生成原创视频小程序中的功能列表&#xff1a; 文字转视频&#xff1a; 输入文字或文章&…

x264_ratecontrol_mb解析

目的 x264_ratecontrol_mb调用发生在宏块编码之后,如果开启了AQ,则在AQ之后,由slice_write调用,从函数名称看,是用于宏块级码率控制,但是它与调用宏块QP没有直接的关系,该函数的主要目的由两个: 更新rc->qpa_aq和rc->qpa_rc的值rc->qpa_aq为当前slice目前宏块…

2024.7.5

2024.7.5 【向之所欣&#xff0c;俯仰之间&#xff0c;已为陈迹。】 Thursday 五月三十 组合 数学&#xff01; 可能公式比较多 二项式&#xff01; $$ \begin{pmatrix}n\m\end{pmatrix}\begin{pmatrix}n-1\m-1 \end{pmatrix}\begin{pmatrix} n-1 \m\end{pmatrix} \begi…

使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击(一)

文章目录 概要开发思路界面编辑新建工程&#xff0c;设置界面大小导入素材场景编辑场景编辑 移动组件输入组件添加移动状态脚本定位组件 概要 飞船设计游戏的学习&#xff0c;如下所示 原视频地址&#xff1a; https://www.youtube.com/playlist?listPL9FzW-m48fn09w6j8Now…

go语言day09 通道 协程的死锁

Go语言学习——channel的死锁其实没那么复杂 - JackieZheng - 博客园 (cnblogs.com) 目录 通道 创建通道 1&#xff09;无缓冲通道 2&#xff09;有缓冲通道 通道的使用 1) 值从通道入口进 2) 值从通道出口出 信道死锁&#xff1a; 0&#xff09;死锁现场0 1&#xff09;死…

# [0701] Task05 策略梯度、Actor-critic 算法

easy-rl PDF版本 笔记整理 P4、P9 joyrl 比对 补充 P9 - P10 相关 代码 整理 最新版PDF下载 地址&#xff1a;https://github.com/datawhalechina/easy-rl/releases 国内地址(推荐国内读者使用)&#xff1a; 链接: https://pan.baidu.com/s/1isqQnpVRWbb3yh83Vs0kbw 提取码: us…

气压传感器在自动驾驶汽车还有哪些应用场景

气压传感器在近年来被广泛应用于各种新兴领域&#xff0c;以下是其中几个最新的应用&#xff1a; 1、自动驾驶汽车&#xff1a;自动驾驶汽车需要精确的气压传感器来监测道路上的气压变化&#xff0c;帮助车辆进行准确的定位和导航。气压传感器可以提供高精度、可靠的气压数据&…

ezKL;zk-SNARK;零知识证明简单举例说明

目录 ezKL是什么 一、基本概述 二、技术特点 三、使用场景 四、使用方法 五、结论 zk-SNARK 一、定义与特点 二、工作原理 三、应用场景 四、技术挑战 五、未来发展 零知识证明简单举例说明,怎么使用 例子一:房间钥匙的证明 例子二:身份验证 例子三:球的颜色…

git reset 和 git revert区别

git reset 和 git revert 是两个用于撤销提交历史的 Git 命令&#xff0c;它们的主要区别在于&#xff1a; 1、git reset&#xff1a; 作用&#xff1a;用于将当前分支的 HEAD 指针移动到另一个位置&#xff0c;通常是将其重置到之前的提交上。影响&#xff1a;重置会修改历史…

Nuxt 项目集成第三方UI组件库(九)

Nuxt.js 本身并不提供内置的 UI 组件库&#xff0c;它是一个用于构建服务端渲染&#xff08;SSR&#xff09;和静态生成&#xff08;SSG&#xff09;Vue.js应用的框架。Nuxt.js 的设计目的是提供基础的架构和配置&#xff0c;以便开发者可以根据自己的需求选择和集成第三方 UI …

Java中类加载器引起的ClassNotFoundException和NoClassDefFoundError

在Java开发过程中&#xff0c;ClassNotFoundException和NoClassDefFoundError是两种常见的异常&#xff0c;特别是在涉及类加载器时更容易遇到。本文将探讨这两种异常的成因、区别以及如何解决由类加载器引起的问题。 一、理解ClassNotFoundException和NoClassDefFoundError …

GUKE万能工具箱(附带源码)

GUKE万能工具箱&#xff08;附带源码&#xff09; 效果图部分源码领取完整源码下期更新 效果图 部分源码 <!DOCTYPE html> <html><head><meta charset"utf-8" name"viewport" content"widthdevice-width, initial-scale1"…

哏号分治,CF103D - Time to Raid Cowavans

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 103D - Time to Raid Cowavans 二、解题报告 1、思路分析 想了半天数据结构最终选择根号分治 我们考虑 大于 550 的公差直接暴力 小于550 的公差的所有询问&#xff0c;我们直接计算该公差后缀和&#xf…