`
dawuafang
  • 浏览: 1192041 次
文章分类
社区版块
存档分类
最新评论

再说Android RecyclerView局部刷新那个坑

 
阅读更多

关键:public final void notifyItemChanged(int position, Object payload)

RecyclerView局部刷新大家都遇到过,有时候还说会遇见图片闪烁的问题。

优化之前的效果:

这里写图片描述

优化之后的效果:

这里写图片描述

如果想单独更新一个item,我们通常会这样做,代码如下:

mLRecyclerViewAdapter.notifyItemChanged(position);

这个也能达到更新的效果,但是有时候却美中不足。那么有没有更好的办法呢?通过查看api,我们发现了另一个方法:

/**
         * Notify any registered observers that the item at <code>position</code> has changed with an
         * optional payload object.
         *
         * <p>This is an item change event, not a structural change event. It indicates that any
         * reflection of the data at <code>position</code> is out of date and should be updated.
         * The item at <code>position</code> retains the same identity.
         * </p>
         *
         * <p>
         * Client can optionally pass a payload for partial change. These payloads will be merged
         * and may be passed to adapter's {@link #onBindViewHolder(ViewHolder, int, List)} if the
         * item is already represented by a ViewHolder and it will be rebound to the same
         * ViewHolder. A notifyItemRangeChanged() with null payload will clear all existing
         * payloads on that item and prevent future payload until
         * {@link #onBindViewHolder(ViewHolder, int, List)} is called. Adapter should not assume
         * that the payload will always be passed to onBindViewHolder(), e.g. when the view is not
         * attached, the payload will be simply dropped.
         *
         * @param position Position of the item that has changed
         * @param payload Optional parameter, use null to identify a "full" update
         *
         * @see #notifyItemRangeChanged(int, int)
         */
        public final void notifyItemChanged(int position, Object payload) {
            mObservable.notifyItemRangeChanged(position, 1, payload);
        }

重点看payload参数介绍:

payload Optional parameter, use null to identify a "full" update

翻译过来就是如果payload参数是null,那么就会来一个“完整的”更新,也就是说会全部更新。

下面我们说一下具体怎么使用。

模拟更新一条数据:

int position = 1;//指定列表中的第2个item

            ItemModel itemModel = mDataAdapter.getDataList().get(position);
            itemModel.id = 100;
            itemModel.title = "refresh item " + itemModel.id;
            itemModel.imgUrl = "http://avatar.csdn.net/2/9/C/1_jdsjlzx.jpg";
            mDataAdapter.getDataList().set(position,itemModel);

            //RecyclerView局部刷新  详见:https://github.com/jdsjlzx/LRecyclerView/issues/45
            // notifyItemChanged(int position, Object payload) 其中的payload相当于一个标记,类型不限
            mLRecyclerViewAdapter.notifyItemChanged(mLRecyclerViewAdapter.getAdapterPosition(false,position) , position);

adapter中的onBindViewHolder方法:

@Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            bind(holder,position);
        }

        //局部刷新关键:带payload的这个onBindViewHolder方法必须实现
        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position, List payloads) {
            TLog.error("onBindViewHolder payloads.isEmpty() ?  " + payloads.isEmpty() );
            if (payloads.isEmpty()) {
                onBindViewHolder(holder,position);
            } else {//需要更新的数据
                TLog.error("onBindViewHolder payloads.size() =  " + payloads.size());

                //notifyItemChanged(int position, Object payload) 要与payload的类型保持一致
                if (payloads.get(0) instanceof Integer) {
                    bind(holder,position);
                }

            }
        }

上面代码说结合LRecyclerView框架来测试的,想要体验完整demo,请参考:https://github.com/jdsjlzx/LRecyclerView

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>
分享到:
评论

相关推荐

    RecyclerView局部刷新demo

    RecyclerView的局部刷新功能是其优化性能的关键特性,它允许开发者只更新列表中的特定部分,而不是重新绘制整个列表。下面将详细探讨RecyclerView的局部刷新及其优化策略。 1. **局部刷新原理**: RecyclerView...

    RecyclerView局部刷新

    自己写的一个RecyclerView里面的item中的控件的局部刷新。 注意这里是item中控件的局部刷新,而不是item整体刷新,这里本人是用到了金融方面加载股票行情数据列表的时候使用到了,找了很多,没有解决,最后自己写了...

    Android-RecyclerView局部刷新下拉刷新瀑布流增加删除动画拖动改变位置滑动删除

    1. **局部刷新**:RecyclerView的一个显著优点是能够高效地更新列表中的单个条目,而不是像ListView那样需要重新绘制整个列表。使用`notifyItemInserted()`, `notifyItemRemoved()`, `notifyItemChanged()`等方法,...

    Android 更新RecyclerView的好方法

    一般在使用RecyclerView的时候不免要修改RecyclerView的数据,使用notifyDataSetChanged()来刷新界面,但是当数据比较多,而只是修改了一点的数据,或者刷新比较频繁,这样就会导致界面的卡顿问题,用户交互特别不好...

    局部刷新导致界面会闪烁的问题

    当提到“局部刷新导致界面会闪烁的问题”,我们关注的是一个常见的用户体验问题,尤其是在Web应用或者桌面软件中。这个问题通常发生在更新或重新渲染部分界面元素时,由于不恰当的处理方式,导致屏幕闪烁或者卡顿,...

    android listview局部刷新和模拟应用下载 实例源码

    为实现更高效的局部刷新,我们可以使用`notifyItemChanged(int position)`或`notifyItemRangeChanged(int positionStart, int itemCount)`方法,这两个方法来自`RecyclerView.Adapter`,不过在兼容库中,ListView的`...

    Android RecyclerView点击事件

    RecyclerView还通过解耦显示、缓存、回收和布局等过程,使开发者能更加灵活地自定义界面效果,支持局部刷新。 **一、RecyclerView的基本组成** 1. **RecyclerView.Adapter**:适配器,负责将数据绑定到视图。你...

    listview局部刷新Demo

    4. **局部刷新优化**:为了实现局部刷新,我们需要在`getView()`中判断当前处理的position是否对应已更新的数据。如果是,则更新该位置的视图;如果不是,就直接返回convertView。这样,只有发生改变的列表项才会被...

    fragment局部刷新

    局部刷新(局部更新)对于优化用户体验和提高应用性能至关重要,尤其是在处理复杂视图或者数据流时。Fragment的局部刷新机制能够帮助我们避免不必要的全屏刷新,从而节省资源并提升响应速度。 1. **Fragment的生命...

    RecyclerView超简单demo(局部更新取代ListView)

    回顾上一篇写RecyclerView的博客(android RecyclerView布局真的只是那么简单!)。笔者比较具体地讲了一下自己对RecyclerView的理解,但是可能知识点比较杂乱,部分新手读者还是无法领会其意。正好笔者最近学习到...

    Android Studio中,多个坐标点拟合平面方程,RecyclerView刷新显示的问题(在第195,194行)

    使用`notifyItemInserted()`、`notifyItemRangeChanged()`等局部刷新方法,仅对改变的数据进行更新。 为了解决这个问题,首先要定位195行和194行的代码,分析其逻辑。检查数据模型、适配器更新以及主线程的使用情况...

    Android中使用RecyclerView实现下拉刷新和上拉加载

    通过以上步骤,你可以在Android应用中成功地使用RecyclerView实现下拉刷新和上拉加载功能。值得注意的是,Android生态系统中有许多优秀的第三方库,如SwipeRefreshLayout(适用于简单的下拉刷新)、LoadMoreWrapper...

    (史上最全的使用RecyclerView实现下拉刷新和上拉加载更多)示例demo

    总结,这个示例代码主要展示了如何在Android应用中利用RecyclerView实现下拉刷新和上拉加载更多功能,这是移动应用常见的交互模式,理解并掌握这一技巧对于提升用户体验至关重要。通过学习这个示例,开发者可以更好...

    刷新单个item,模仿老虎的实时刷新item

    综上所述,实现"刷新单个item,模仿老虎的实时刷新item"涉及了Android的多项技术,包括但不限于局部刷新策略、刷新组件、数据加载、动画效果、性能优化以及状态管理。理解并掌握这些知识点,有助于构建出响应快速、...

    listView的item局部刷新

    "listView的item局部刷新"是Android开发中的一个重要知识点,它涉及到如何有效地更新ListView中的单个或部分列表项,而不是重新绘制整个列表。 首先,我们需要理解ListView的工作原理。ListView通过Adapter来绑定...

    listview局部刷新

    在局部刷新中,我们需要通过Adapter来更新特定项的数据,然后调用`notifyDataSetChanged()`或`notifyItemChanged(int position)`(如果使用了Android Support Library或AndroidX的RecyclerView)来通知ListView数据...

    局部刷新ListView数据信息的自定义选择列表

    总结起来,实现局部刷新ListView数据信息的自定义选择列表,需要熟练掌握Adapter、数据模型、事件处理和UI更新等Android基础知识。通过精确控制Adapter的通知机制,我们可以实现高效、流畅的列表刷新体验,提高应用...

    ListView局部刷新

    总的来说,ListView的局部刷新是Android开发中的重要技巧,通过合理使用可以优化应用性能,提供更好的用户体验。开发者应该根据具体需求选择合适的刷新方式,并注意刷新过程中的细节处理。在实际项目中,结合其他...

    这些年,我爬过的 Android 坑 | 持续更新

    总结目录 视图篇 如何理解非主线程可以更新UI ... recyclerview 局部刷新Item时会因为默认动画导致闪烁的解决方案 recyclerview 中的 item 出现莫名的偏移滚动 recyclerview 内容超过一屏时,f

    安卓下拉上拉刷新相关-仿UC天气下拉和微信下拉眼睛.zip

    - Android中常用的库有SwipeRefreshLayout,它可以包裹一个子View,如RecyclerView,当用户下拉时,会显示一个刷新指示器,并触发OnRefreshListener的onRefresh方法。 2. **上拉加载更多(Load More)**: - 上拉...

Global site tag (gtag.js) - Google Analytics