关键: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
* 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
* 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
*/
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
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);
}
@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());
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的局部刷新功能是其优化性能的关键特性,它允许开发者只更新列表中的特定部分,而不是重新绘制整个列表。下面将详细探讨RecyclerView的局部刷新及其优化策略。 1. **局部刷新原理**: RecyclerView...
自己写的一个RecyclerView里面的item中的控件的局部刷新。 注意这里是item中控件的局部刷新,而不是item整体刷新,这里本人是用到了金融方面加载股票行情数据列表的时候使用到了,找了很多,没有解决,最后自己写了...
1. **局部刷新**:RecyclerView的一个显著优点是能够高效地更新列表中的单个条目,而不是像ListView那样需要重新绘制整个列表。使用`notifyItemInserted()`, `notifyItemRemoved()`, `notifyItemChanged()`等方法,...
一般在使用RecyclerView的时候不免要修改RecyclerView的数据,使用notifyDataSetChanged()来刷新界面,但是当数据比较多,而只是修改了一点的数据,或者刷新比较频繁,这样就会导致界面的卡顿问题,用户交互特别不好...
当提到“局部刷新导致界面会闪烁的问题”,我们关注的是一个常见的用户体验问题,尤其是在Web应用或者桌面软件中。这个问题通常发生在更新或重新渲染部分界面元素时,由于不恰当的处理方式,导致屏幕闪烁或者卡顿,...
为实现更高效的局部刷新,我们可以使用`notifyItemChanged(int position)`或`notifyItemRangeChanged(int positionStart, int itemCount)`方法,这两个方法来自`RecyclerView.Adapter`,不过在兼容库中,ListView的`...
RecyclerView还通过解耦显示、缓存、回收和布局等过程,使开发者能更加灵活地自定义界面效果,支持局部刷新。 **一、RecyclerView的基本组成** 1. **RecyclerView.Adapter**:适配器,负责将数据绑定到视图。你...
4. **局部刷新优化**:为了实现局部刷新,我们需要在`getView()`中判断当前处理的position是否对应已更新的数据。如果是,则更新该位置的视图;如果不是,就直接返回convertView。这样,只有发生改变的列表项才会被...
局部刷新(局部更新)对于优化用户体验和提高应用性能至关重要,尤其是在处理复杂视图或者数据流时。Fragment的局部刷新机制能够帮助我们避免不必要的全屏刷新,从而节省资源并提升响应速度。 1. **Fragment的生命...
回顾上一篇写RecyclerView的博客(android RecyclerView布局真的只是那么简单!)。笔者比较具体地讲了一下自己对RecyclerView的理解,但是可能知识点比较杂乱,部分新手读者还是无法领会其意。正好笔者最近学习到...
使用`notifyItemInserted()`、`notifyItemRangeChanged()`等局部刷新方法,仅对改变的数据进行更新。 为了解决这个问题,首先要定位195行和194行的代码,分析其逻辑。检查数据模型、适配器更新以及主线程的使用情况...
通过以上步骤,你可以在Android应用中成功地使用RecyclerView实现下拉刷新和上拉加载功能。值得注意的是,Android生态系统中有许多优秀的第三方库,如SwipeRefreshLayout(适用于简单的下拉刷新)、LoadMoreWrapper...
总结,这个示例代码主要展示了如何在Android应用中利用RecyclerView实现下拉刷新和上拉加载更多功能,这是移动应用常见的交互模式,理解并掌握这一技巧对于提升用户体验至关重要。通过学习这个示例,开发者可以更好...
综上所述,实现"刷新单个item,模仿老虎的实时刷新item"涉及了Android的多项技术,包括但不限于局部刷新策略、刷新组件、数据加载、动画效果、性能优化以及状态管理。理解并掌握这些知识点,有助于构建出响应快速、...
"listView的item局部刷新"是Android开发中的一个重要知识点,它涉及到如何有效地更新ListView中的单个或部分列表项,而不是重新绘制整个列表。 首先,我们需要理解ListView的工作原理。ListView通过Adapter来绑定...
在局部刷新中,我们需要通过Adapter来更新特定项的数据,然后调用`notifyDataSetChanged()`或`notifyItemChanged(int position)`(如果使用了Android Support Library或AndroidX的RecyclerView)来通知ListView数据...
总结起来,实现局部刷新ListView数据信息的自定义选择列表,需要熟练掌握Adapter、数据模型、事件处理和UI更新等Android基础知识。通过精确控制Adapter的通知机制,我们可以实现高效、流畅的列表刷新体验,提高应用...
总的来说,ListView的局部刷新是Android开发中的重要技巧,通过合理使用可以优化应用性能,提供更好的用户体验。开发者应该根据具体需求选择合适的刷新方式,并注意刷新过程中的细节处理。在实际项目中,结合其他...
总结目录 视图篇 如何理解非主线程可以更新UI ... recyclerview 局部刷新Item时会因为默认动画导致闪烁的解决方案 recyclerview 中的 item 出现莫名的偏移滚动 recyclerview 内容超过一屏时,f
- Android中常用的库有SwipeRefreshLayout,它可以包裹一个子View,如RecyclerView,当用户下拉时,会显示一个刷新指示器,并触发OnRefreshListener的onRefresh方法。 2. **上拉加载更多(Load More)**: - 上拉...