RecyclerView 局部刷新的坑,2024年Android网络编程总结篇

本文介绍了Android中RecyclerView局部刷新的原理和使用方法,通过代码示例展示了如何使用notifyItemChanged方法进行局部更新。文章还强调了payload参数的重要性,指出传入null表示全量更新,而传入其他值则用于区分不同的局部更新场景。同时,提供了适配器的完整实现,包括两个onBindViewHolder方法,用于处理payload为空和不为空的情况,以实现高效的视图复用和局部刷新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里我们看到一句话:

@param payload Optional parameter, use null to identify a “full” update

传入“null”就是更新全部!那我们调用的时候是传入什么呢!看下:

public final void notifyItemChanged(int position) {
mObservable.notifyItemRangeChanged(position, 1);
}

继而调用:

public void notifyItemRangeChanged(int positionStart, int itemCount) {
notifyItemRangeChanged(positionStart, itemCount, null);
}

继而调用:

public void notifyItemRangeChanged(int positionStart, int itemCount, Object payload) {
// since onItemRangeChanged() is implemented by the app, it could do anything, including
// removing itself from {@link mObservers} - and that could cause problems if
// an iterator is used on the ArrayList {@link mObservers}.
// to avoid such problems, just march thru the list in the reverse order.
for (int i = mObservers.size() - 1; i >= 0; i–) {
mObservers.get(i).onItemRangeChanged(positionStart, itemCount, payload);
}
}

[捂脸] 一个大写的null…

OK,那我们修改下我们的调用方法:

/**

  • 暴露用于修改进度值的方法
  • @param progress
  • @param position
  • @param progressStr
    */
    public void setProgress(int progress, int position, String progressStr) {
    data.get(position).setProgress(progress);
    data.get(position).setDownloadPerSize(progressStr);
    notifyItemChanged(position, 1);
    }

/**

  • 暴露用于修改按钮文字值的方法
  • @param position
  • @param buttonStr
    */
    public void setButtonStatus(int position, String buttonStr) {
    data.get(position).setDownloadPerSize(buttonStr);
    notifyItemChanged(position, 1);
    }

这里我们传入了一个 “1”,这个1是随意传入的,其他值也可以。

继而我们需要重写onBindViewHolder方法如下:

@Override
public void onBindViewHolder(TestDownLoadHolder holder, int position, List payloads) {
XLog.e(“--------------------------has payloads”);
if (payloads.isEmpty()) {
XLog.e(“--------------------------no payloads”);
onBindViewHolder(holder, position);
} else {
XLog.e(“--------------------------false payloads”);
final AppInfoBean appInfoBean = data.get(position);
if (appInfoBean != null) {
holder.mPbDownProgress.setProgress(appInfoBean.getProgress());
holder.mBtDownLoad.setText(appInfoBean.getDownloadPerSize());
}
}
}

@Override
public void onBindViewHolder(final TestDownLoadHolder holder, final int position) {
final AppInfoBean appInfoBean = data.get(position);
if (appInfoBean != null) {
ILFactory.getLoader().loadNet(holder.mIvDownPic, appInfoBean.getDownLoadPic(), ImgOptions.getDefImaOptions());
holder.mPbDownProgress.setProgress(appInfoBean.getProgress());
holder.mBtDownLoad.setText(appInfoBean.getDownloadPerSize());
holder.mBtDownLoad.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (getRecItemClick() != null) {
getRecItemClick().onItemClick(position, appInfoBean, 0, holder);
}
}
});
}

}

可以看到我们这里有2个onBindViewHolder方法,在第一个OnBindViewHolder里面我们需要判断下_payloads_是否为空,如果为空的话执行默认的OnBindViewHolder方法,如果不为空的话,执行我们自己的局部刷新方法

if (payloads.isEmpty()) {
XLog.e(“--------------------------no payloads”);
onBindViewHolder(holder, position);
} else {
XLog.e(“--------------------------false payloads”);
final AppInfoBean appInfoBean = data.get(position);
if (appInfoBean != null) {
holder.mPbDownProgress.setProgress(appInfoBean.getProgress());
holder.mBtDownLoad.setText(appInfoBean.getDownloadPerSize());
}
}

贴下完整的适配器方法:

/**

  • @author Ly
  • @date 2017/10/26
    */

public class TestDownLoadAdapter extends SimpleRecAdapter<AppInfoBean, TestDownLoadAdapter.TestDownLoadHolder> {
public TestDownLoadAdapter(Context context) {
super(context);
}

@Override
public TestDownLoadHolder newViewHolder(View itemView) {
return new TestDownLoadHolder(itemView);
}

/**

  • 更新列表数据某一项的packageName
  • @param position 下标
  • @param packageName 要替换的文本名
    */
    public void updateItem(int position, String packageName) {
    if (position <= 0 && position < data.size()) {
    data.get(position).setPackageName(packageName);
    }
    notifyDataSetChanged();
    }

/**

  • 暴露用于修改进度值的方法
  • @param progress
  • @param position
  • @param progressStr
    */
    public void setProgress(int progress, int position, String progressStr) {
    data.get(position).setProgress(progress);
    data.get(position).setDownloadPerSize(progressStr);
    notifyItemChanged(position, 1);
    }

/**

  • 暴露用于修改按钮文字值的方法
  • @param position
  • @param buttonStr
    */
    public void setButtonStatus(int position, String buttonStr) {
    data.get(position).setDownloadPerSize(buttonStr);
    notifyItemChanged(position, 1);
    }

@Override
public int getLayoutId() {
return R.layout.item_test_down;
}

@Override
public void onBindViewHolder(TestDownLoadHolder holder, int position, List payloads) {
XLog.e(“--------------------------has payloads”);
if (payloads.isEmpty()) {
XLog.e(“--------------------------no payloads”);
onBindViewHolder(holder, position);
} else {
XLog.e(“--------------------------false payloads”);
final AppInfoBean appInfoBean = data.get(position);
if (appInfoBean != null) {
holder.mPbDownProgress.setProgress(appInfoBean.getProgress());
holder.mBtDownLoad.setText(appInfoBean.getDownloadPerSize());
}
}
}

@Override
public void onBindViewHolder(final TestDownLoadHolder holder, final int position) {
final AppInfoBean appInfoBean = data.get(position);
if (appInfoBean != null) {
ILFactory.getLoader().loadNet(holder.mIvDownPic, appInfoBean.getDownLoadPic(), ImgOptions.getDefImaOptions());
holder.mPbDownProgress.setProgress(appInfoBean.getProgress());
holder.mBtDownLoad.setText(appInfoBean.getDownloadPerSize());
holder.mBtDownLoad.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (getRecItemClick() != null) {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

写在最后

由于本文罗列的知识点是根据我自身总结出来的,并且由于本人水平有限,无法全部提及,欢迎大神们能补充~

将来我会对上面的知识点一个一个深入学习,也希望有童鞋跟我一起学习,一起进阶。

提升架构认知不是一蹴而就的,它离不开刻意学习和思考。

**这里,笔者分享一份从架构哲学的层面来剖析的视频及资料分享给大家,**梳理了多年的架构经验,筹备近1个月最新录制的,相信这份视频能给你带来不一样的启发、收获。

领取方式:点击这里获取免费架构视频资料

最近还在整理并复习一些Android基础知识点,有问题希望大家够指出,谢谢。

希望读到这的您能转发分享和关注一下我,以后还会更新技术干货,谢谢您的支持!

转发+点赞+关注,第一时间获取最新知识点

-YO8zgHF1-1710671714657)]

[外链图片转存中…(img-0MYJhrYA-1710671714657)]

领取方式:点击这里获取免费架构视频资料

最近还在整理并复习一些Android基础知识点,有问题希望大家够指出,谢谢。

希望读到这的您能转发分享和关注一下我,以后还会更新技术干货,谢谢您的支持!

转发+点赞+关注,第一时间获取最新知识点

Android架构师之路很漫长,一起共勉吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值