Loading [MathJax]/jax/output/CommonHTML/config.js
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在android中滚动时,高亮显示的项目在重新查看时会丢失

在Android开发中,滚动时高亮显示的项目在重新查看时丢失的问题通常与RecyclerView的视图回收机制有关。RecyclerView通过重用已经滑出屏幕的视图来提高性能,这就可能导致一些状态(如高亮显示)在视图被回收和重用时丢失。

基础概念

  • RecyclerView: 是一个用于显示大量数据集合的组件,它提供了灵活的布局管理,并通过视图回收机制来优化性能。
  • ViewHolder: RecyclerView使用ViewHolder模式来缓存视图,减少findViewById的调用次数,提高列表滚动时的性能。
  • 视图回收: 当列表项滑出屏幕时,RecyclerView会将这些视图回收起来,并在新的列表项需要显示时重用这些视图。

相关优势

  • 性能优化: 视图回收机制减少了创建和销毁视图的开销,使得列表滚动更加流畅。
  • 内存效率: 通过重用视图,可以减少内存中同时存在的视图数量,降低内存消耗。

类型与应用场景

  • 线性布局: 使用LinearLayoutManager,适用于简单的垂直或水平列表。
  • 网格布局: 使用GridLayoutManager,适用于需要多列显示的场景。
  • 瀑布流布局: 使用StaggeredGridLayoutManager,适用于图片等高度不一致的列表项。

遇到的问题及原因

问题:滚动时高亮显示的项目在重新查看时丢失。 原因:当RecyclerView滚动时,已经滑出屏幕的视图会被回收并重用给新的列表项。如果没有正确地保存和恢复每个列表项的状态,那么之前的高亮显示状态就会丢失。

解决方法

为了保持高亮状态,需要在Adapter中保存每个列表项的状态,并在视图被重用时恢复这些状态。

代码语言:txt
复制
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    private List<Item> items;
    private SparseBooleanArray selectedItems;

    public MyAdapter(List<Item> items) {
        this.items = items;
        this.selectedItems = new SparseBooleanArray();
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Item item = items.get(position);
        holder.textView.setText(item.getText());

        // 恢复高亮状态
        holder.itemView.setSelected(selectedItems.get(position, false));
    }

    @Override
    public int getItemCount() {
        return items.size();
    }

    public void toggleSelection(int position) {
        if (selectedItems.get(position, false)) {
            selectedItems.delete(position);
        } else {
            selectedItems.put(position, true);
        }
        notifyItemChanged(position);
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        TextView textView;

        ViewHolder(View itemView) {
            super(itemView);
            textView = itemView.findViewById(R.id.textView);
            itemView.setOnClickListener(v -> {
                // 切换高亮状态
                int adapterPosition = getAdapterPosition();
                if (adapterPosition != RecyclerView.NO_POSITION) {
                    ((MyAdapter) itemView.getTag()).toggleSelection(adapterPosition);
                }
            });
        }
    }
}

在这个示例中,我们使用SparseBooleanArray来保存每个列表项的高亮状态。当列表项被点击时,我们切换其高亮状态,并通过notifyItemChanged通知RecyclerView更新视图。在onBindViewHolder方法中,我们根据保存的状态来设置视图的高亮显示。

通过这种方式,即使视图被回收和重用,高亮状态也能够得到正确的恢复。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Smobiler 4.4已正式发布!(Smobiler能让你在Visual Studio上开发APP)

2, 修改项目模板MobileForm,MobileUserControl中的引用为Smobiler.Plugins,取消对Smobiler.Core.Controls.Native的引用。...3, 设计器中的控件如果移动到相对布局则重置Location。 4, 侧边栏在用户未设置高度与Flex时Flex默认为1,防止因未设置宽度而不显示的问题。...3, 修复FontIcon取消选择时默认显示adjust的问题。 4, 修复GridView与ListView中Head、Foot的在没有数据时不显示的问题。...5, 修复AlbumView控件的ResourcePath与ThumbResourcePath属性无效的问题。 6, 修复Picker中的内容设置为空时会崩溃的问题。...7, 修复设计器撤销控件更改时,控件丢失的问题。 8, 修复iOS版中,滚动panel中TextBox弹出键盘异常的问题。 9,  修复ListView没有行项时使用NewData报错问题。

1.9K20

Android 触摸屏交互之手势监听

正文 屏幕的交互当然首先是触摸,说道触摸就是有一个手势监听,这个是Google起的名字,你不用手难道用脚吗? 下面可以新建一个项目,在MainActivity中实现两个监听 ?...public boolean onSingleTapUp(MotionEvent e) { return false; } onScroll /** * 在屏幕上发起滚动的手势时会触发该方法...在Android中,是由GestureDetector类来负责手势的检测,每一个GestureDetector类的实例都代表一个手势监听器。...+= "onSingleTapUp\n"; tvResult.setText(result); return false; } /** * 在屏幕上发起滚动的手势时会触发该方法...这就是基本的事件逻辑了,可以根据自己的需求进一步做处理,比如音量屏幕左边上滑时调节亮度,右边上滑时调节音量,这都是通过在onScroll方法中做处理实现的。OK,就是这样了

1.7K30
  • 【Hybrid开发高级系列】ReactNative(七) —— RN组件专题

    如果重新呈现它们耗费很大,那就把它们包在StaticContainer或其他适当的机制中。在每一个呈现过程中,页脚始终是在列表的底部,页眉始终在列表的顶 部。...onScroll函数型 onScrollAnimationEnd函数型 pagingEnabled布尔型         当为真时,滚动视图在滚动时会在滚动视图的尺寸的倍数上停止滚动。...在接下来的例子中,嵌套的标题和正文文本将从style s.baseText继承FontFamily,但是标题会提供它自己其他的设计风格。标题和正文在文字换行时会堆叠在彼此 之上。...4.1.2 将静态资源添加到您的Android应用程序中         将您的图像作为位图画板添加到android项目中( /android/app/src/main/res)。...NOTE:生成应用程序所需的新资源         无论在什么时候您把新的资源添加到您的画板中您都需要在使用它之前通过运行react-nativerun-android重新构建您的应用程序-仅重新加载JS

    58640

    codemirror自定义代码提示_96图文编辑器

    ,这里我把公司项目里用到的那部分抽出来,单独写篇博客,并把抽出来的那部分代码提交到 GitHub 去 简单介绍 CodeMirror 是一款在线的支持语法高亮的代码编辑器。...一般在开发中,添加 lib 下的引用和 mode 下的引用就够了。...electricChars: boolean 在输入可能改变当前的缩进时,是否重新缩进,默认为true (仅在mode支持缩进时有效)。...coverGutterNextToScrollbar: boolean 当fixedGutter启用,并且存在水平滚动条时,在滚动条最左侧默认会显示gutter,当此项设置为true时,gutter会被带有...注意:这样设置在处理大文档时会影响性能。 ---- 如果你要设置代码框的大小该怎么做呢?

    3.6K20

    Snagit for mac(屏幕截图和屏幕录制工具)

    更新日志新功能当选择“捕获时隐藏Snagit”首选项时,视频录制工具栏和控件不会出现在macOS Ventura上的最终录制中。在视频捕获设置中添加了为屏幕绘制对象自定义淡入淡出时间的功能。...功能更新添加了在 Screen Draw 处于活动状态时滚动的功能。当用户退出绘图模式时,屏幕绘图对象现在会自动淡出。改进了 Chrome 网络浏览器中自动滚动箭头的可见性。...提高了视频捕获的稳定性。Bug修复修复了从视频中取消 .gif 导出时发生的崩溃。修复了如果在录制时发生重启,视频文件可能丢失的问题。  修复了视频捕获有时包括录制倒计时结束的问题。...修复了导致在某些环境中无法共享到 Screencast 的问题。修复了自动滚动捕获有时会错过列表中最后一项的问题。修复了防止透明区域添加到全景(手动)滚动捕获的顶部和底部的问题。...修复了全景(手动)滚动捕获后预览窗口有时会保留在屏幕上的问题。修复了录制全屏时 Screen Draw 控件未移动到不同显示器(如果可用)的问题。修复了捕获选择十字准线会将光标检测为选择区域的问题。

    3.1K00

    Node.js 最佳实践:改善你的应用程序设计 | 开源日报 No.191

    通过遵循这些最佳实践,您可以改善自己在使用 Node.js 时所做的应用程序或系统设计。...渐进式编程:允许逐步向代码库中添加类似注释的方式来引入静态 typing,并且在不方便进行静态 typing 时始终可以回退到动态 typing。...Android 上的 Reddit 客户端。...它没有任何广告,具有清晰的用户界面和流畅的浏览体验。 自动滚动帖子:自动滚动帖子使您可以在不移开拇指的情况下享受精彩内容。...无需设置或配置 可以查看任何格式的日志文件,也可以使用 tail 命令来实时跟踪最新内容 高亮显示数字、日期、IP 地址、UUIDs 和 URL 等信息 所有高亮组都可自定义 易于与其他命令集成 使用

    21910

    Android实现图片滚动控件,含页签功能,让你的应用像淘宝一样炫起来

    在Eclipse中新建一个Android项目,项目名就叫做SlidingViewSwitcher。...*/ public void scrollToPrevious() { new ScrollTask().execute(20); } /** * 在onLayout中重新设定菜单元素和标签元素的参数...之后在onLayout里又动态加入了页签View,有几个图片控件就会加入几个页签,然后根据currentItemIndex来决定高亮显示哪一个页签。...第一个LinearLayout中要放入需要滚动显示的图片,这里我们加入了四个Button,每个Button都设置了一张背景图片。...首先是程序打开的时候,界面显示如下: 然后手指在图片上滑动,我们可以看到图片滚动的效果: 不停的翻页,页签也会跟着一起改变,下图中我们可以看到高亮显示的点是变换的: 恩,对比一下淘宝客户端的效果,我觉得我们模仿的还是挺好的

    23010

    Material Design — 菜单(Menus)

    单个菜单项状态 某些app状态可能会导致只有一个菜单项的情景菜单。 例如,当使网页上的文本高亮时,Android仅显示“复制”菜单项,因为用户无法“剪切”或“粘贴”文本。 ?...情景菜单 菜单是可滚动的 如果菜单高度阻止其显示所有菜单项目,菜单可以在内部滚动。 一个例子是在横向上查看手机上的菜单。 ?...简单菜单 ·打开时,简单菜单会尝试将当前选定的菜单项目与列表项目垂直对齐。 当前选择的菜单项突出显示(如下图)。 ? 向下展开的简单菜单 ?...向上展开的简单菜单 ·不要在简单菜单弹出的第一个选项上放列表中的非已选项(如下图)。 ? ·但在靠近屏幕边缘时,简单菜单会重新定位其垂直对齐方式,以便所有菜单项都完全可见。 ?...·内容可滚动时,菜单一直显示滚动条。 ·简单菜单的最大高度应小于页面高度的一行或多行。 这确保了可点击简单菜单之外的区域来关闭菜单。 ·不在菜单中重复展示已选项(同Menus)。

    5.8K100

    Android实现图片滚动控件,含页签功能

    在Eclipse中新建一个Android项目,项目名就叫做SlidingViewSwitcher。...*/ public void scrollToPrevious() { new ScrollTask().execute(20); } /** * 在onLayout中重新设定菜单元素和标签元素的参数...之后在onLayout里又动态加入了页签View,有几个图片控件就会加入几个页签,然后根据currentItemIndex来决定高亮显示哪一个页签。...第一个LinearLayout中要放入需要滚动显示的图片,这里我们加入了四个Button,每个Button都设置了一张背景图片。...首先是程序打开的时候,界面显示如下: ? 然后手指在图片上滑动,我们可以看到图片滚动的效果: ? 不停的翻页,页签也会跟着一起改变,下图中我们可以看到高亮显示的点是变换的: ?

    1.7K100

    Android高级图片滚动控件,编写3D版的图片轮播器

    在Image3DView的构造函数中初始化了一个Camera和Matrix对象,用于在后面对图片进行3D操作。...然后在initImageViewBitmap()方法中初始化了一些必要的信息,比如对当前图片进行截图,以用于后续的立体操作,得到当前图片的宽度等。...接着当手指在Image3DSwitchView控件上滑动的时候就会进入到onTouchEvent()方法中,当手指按下时会记录按下时的横坐标,然后当手指滑动时会计算出滑动的距离,并调用scrollBy(...)方法来进行滚动,当手指离开屏幕时会距离当前滑动的距离和速度来决定,是滚动到下一张图片,还是滚动到上一张图片,还是滚动回原图片。...在beginScroll()方法中其实就是调用了Scroller的startScroll()方法来执行滚动操作的,当滚动结束后还会调用requestLayout()方法来要求重新布局,之后onLayout

    3.9K81

    Android 开源项目android-open-project解析之(四) ColorPickView,GraphView,UI Style,Other

    ,在设计时,尽量在保证开发效率的同一时候,给使用者提供足够多的定制化能力。...其他特性还包含支持图表缩放、手势移动、动画显示效果、高密度柱形显示、图表分界定制线、多图表的混合显示及同数据源不同类型图表切换等。...ShowcaseView library 用于高亮显示应用程序的特定部分,从而突出突出重点 项目地址:https://github.com/amlcurran/ShowcaseView...的Group滑动到顶端时会固定不动直到另外一个Group到达顶端 项目地址:https://github.com/rtyley/android-pinned-header-listviews...Demo地址:Download Demo 效果图: DynamicCardLayout 在Android中实现的类似Windows8的瓷片布局 项目地址:https://github.com

    1.3K20

    熟悉Android Studio界面,开始装逼卖萌

    4编辑器 编辑器是基于标签的,在Android Studio中每打开一个文件编辑时,会同时打开一个新的文件标签。 ?...5工具条 工具条是用来放置工具的,点击后可以展开工具窗口。Android Studio中的工具条分布在主界面的左右两边和底部(状态栏上面)。...7.1项目工具窗口:Project 项目工具窗口提供了多种视图模式来查看项目结构,在项目工具窗口中我们可以对项目中的文件和目录进行各种操作。 ?...7.5收藏夹工具窗口: Favorites 在使用Android Studio的日常编码中,如果某个文件或某段代码是我们经常需要查看或使用的,那就可以把它添加到收藏夹中,以便快速查看。...区域8为日志操作按钮,从上到下分别为:清除日志、滚动到日志的最后、向上查看堆栈信息、向下查看堆栈信息、开启日志自动换行、打印、重启、Logcat设置、Logcat帮助。

    3.3K60

    不得不珍藏的Chrome插件推荐

    还有它切换和滚动时的动画看着也特别舒服,另外还有一大堆很强的自定义设置功能,这里就不一一列举了,自己去发掘吧。...这是一个很强大的剪藏插件,我们在浏览网页或者是看博客的时候遇到很多不错的文章,我们之前的做法是将网页离线保存下来或者将内容复制保存下来,没错这也是一种保存的办法,但是这种方法不容易查找,容易丢失,阅读也不方便...Postman在发送网络HTTP请求方面可以说是Chrome插件类产品中的代表产品之一。...Octotree是一个用来显示Github项目的目录结构的Chrome插件,主要针对于广大的程序猿童鞋们,Github上面成千上万的开源项目给程序猿带来很多帮助,还可以学习大神们的思想,向大神看齐。...不过,在Github上查看源代码的体验十分糟糕,尤其是从一个目录跳转到另一个目录的时候,非常麻烦。octotree插件就能很好地解决了上述问题。

    93320

    最强 Android Studio 使用小技巧和快捷键

    上下文信息(Context Info) 描述: 当前作用域定义超过滚动区域,执行该操作将显示所在的上下文信息,通常它显示的是类名或者内部类类名或者当前所在的方法名。...恕我直言,最有用的就是在项目结构或者资源管理器中打开该文件。每一个操作都有数字或者字母作为前缀,可以通过这个前缀来快速跳转。...你可以在文件中或者直接在项目视图里使用该操作。 快捷键: Alt + F1; 24....在调试时,当你从一堆相似的对象中查看某个对象是否和之前是一样的,这就是一个非常有用的操作。...然后在文件中随意浏览 3. 直接调用这个快捷键,快速返回之前逐步调试的地方。 快捷键: (Debug时) Alt + F10; 60.

    1.6K10

    Android进阶之绘制-自定义View完全掌握(二)

    要想实现这样的效果,我们可以借助ViewPager控件,然后加上自定义的一些控件即可完成。那么现在就开始吧。 新建一个android项目。 修改activity_main.xml文件。 显示,也可以自己绘制指示点显示,我这种用的是第二种方式。贴出MainActivity的代码。...R.drawable.b1, R.drawable.b2, R.drawable.b3 }; /** * 上一次高亮显示的位置...,而我们的数据又没有这么多,那么在滑动页面的时候肯定会产生索引越界的问题,所以,为了避免这样的问题产生,我们就必须把有页面位置的地方全部取模处理,让其保持在我们的有限数据范围内,这样就能够实现我们的需求了...R.drawable.b1, R.drawable.b2, R.drawable.b3 }; /** * 上一次高亮显示的位置

    44440

    使用Visual Studio Code编写Vue的札记

    二、支持Vue文件的基本语法高亮 在VSCode Marketplace 搜素Vue 出现关于语法高亮的插件有 vue,vue-beautify,vue-color,VueHelper,vertur等等...在VSCode中弹出浏览器并搜索,可编辑搜索引擎 Color Highlight 颜色值在代码中高亮显示 Color Picker 拾色器 Document This 注释文档生成 EditorConfig...for VS Code EditorConfig插件 Emoji 在代码中输入emoji ESLintESLint插件,高亮提示 File Peek 根据路径字符串,快速定位到文件 Font-awesome...codes for html FontAwesome提示代码段 ftp-sync 同步文件到ftp Git Blame在状态栏显示当前行的Git信息 Git History(git log) 查看...Ctrl + K Enter 保持打开 Ctrl + Tab 打开下一个 Ctrl + Shift + Tab 打开上一个 Ctrl + K P 复制当前文件路径 Ctrl + K R 在资源管理器中查看当前文件

    39.3K92

    一个专注于微信公众号 Markdown 排版的平台

    服务器2:暂未上线 Md2X Editor 简介 由于 Md2All 很长一段时间都不再更新,加上有时候 Md2All 的访问不稳定,本项目在 Md2All 的基础上进行了一些调整和修改后的重新部署(...iPone、iPad 上不能滚动的问题; 解决把内容粘贴到公众号时,图片、或样式丢失的问题; 解决超链接字体颜色复制到公众号失效的问题; 支持直接把页面"复制"到 "CSDN" 和 "博客园" 中,所有的样式保持一致...默认为图片居中,如果想居左时,请打开"一键排版"下的 css 样式中的img{margin:0 0;}, [这里写图片描述]中对图片的描述内容会自动生成在图片的底部,对应样式figcaption{}。...Tips 自动保存 请点击左上角"编辑"图标再开始写作,这样就能自动保存写作内容,目前,所有保存的内容都是储存在本地浏览器缓存中(local storage),所以,就算重新开机,这些内容都不会丢失的呵...分隔线 ---- Markdown 扩展语法 表格 班级 男生 女生 一(7)班 30 25 一(8)班 25 30 注:表格在公众号预览时,可能在 PC 端显示的不是正确的全屏,但在手机上预览时就会正常显示为全屏的了

    3.3K21

    Android Studio 4.0重磅发布:全新的 Motion 编辑器及众多更新都在这里!

    在 Android Studio 4.0 中,CPU 记录现在与 Profiler 主时间轴分开显示,并按组分类以简化分析过程。你可以上下移动组,或者在组中拖放项目以定制界面。 ?...我们还重新设计了 System Trace(系统跟踪)UI,为事件添加了各自的颜色来方便区分,对线程进行排序,把较忙的线程放在前面,而且现在你可以只查看所选线程的数据。...编写 R8 规则时的智能编辑器功能 R8 是在 Android Gradle 插件 3.4.0 中引入的,可将 desugaring、缩减、混淆、优化和 dexing 合并为一个步骤,从而显著提高构建性能...在为 R8 创建规则文件时,Android Studio 现在提供了智能编辑器功能,例如语法高亮显示、自动完成和错误检查。...但是,你可能不是每个项目都需要这些库和功能。在该插件的 4.0.0 版本中,你现在可以单独禁用构建功能,如下所示,这可以优化大型项目的构建性能。

    4.7K30
    领券