最近 做项目,设计到一个recycleView里面 更新进度条的需求。在网上搜索了 一下,发现了一个方法。然后,自己又深入研究了一下 。现在写一下见解。
首先,我们来认识一下 RecyclerView.Adapter 里面的两个方法
第一个是: public void onBindViewHolder(@NonNull ViewHolder holder, int position)
第二个是: public void onBindViewHolder(@NonNull VH holder, int position, @NonNull List<Object> payloads) { onBindViewHolder(holder, position); }
第二个方法要和 notifyItemChanged(int position, @Nullable Object payload)
这个方法一起用。这个一定要注意 和平常的notifyItemChanged 相比 多个 一个 payload 参数 。这个是我们自己自定义的值 用来标识 你想更新那个控件,对应于第二个里面的List payloads
如果你细心看的话,你会发现 第二个方法会多了一个参数 List< Object> payloads。这个参数是用来干什么用的呢? 看Android源码
这个意思呢 ,就是当payloads 不是空的时候, ViewHolder 只会进行 有效率的,局部的更新绑定。如果payloads为空的时候,那么Adapter 必须进行一个完整的绑定。
这样大家就明白了吧。在ViewHolder 调用周期里面,总是会先调用 带payloads参数的这个方法,再决定是否调用 不带payloads参数的方法。 在recycleView的绘制视图中,系统会默认的将payloads这个参数设置为空,所以我们如果不做设定的话,每次都是更新整个item。
如果 要是你的item中含有 加载图片的话,你就会发现 每次刷新视图都会重新加载图片,浪费流量不说,也耗费性能。
接下来 我就写了一个小demo 用来验证一下
首先当然是我们的 item布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<Button
android:id="@+id/one"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="one"
/>
<Button
android:id="@+id/two"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="two"
/>
<Button
android:id="@+id/three"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="three"
/>
</LinearLayout>
页面布局就是一个recycleView 这个就不贴代码了
为了贴近 真实项目 我还定义了bean 用于承载数据
package com.admin.plani.item;
/**
* 创建时间 2018/9/26
*
* @author plani
*/
public class TestBean {
private String image;
private String size;
private int age;
public TestBean(String image, String size, int age) {
this.