RecycleView刷新功能

RecycleView刷新某一个Item,或这某一个Item中某一个View。

这样的需求,在实际的开发中是很普遍的。

在数据变化后需要刷新列表。

刷新列表有三种方式:

前两种大家应该很熟,第三中会有点陌生。

 那么这三种方式,有什么却别呢?

  public void updateData() {
        notifyDataSetChanged();
    }

    public void updateData(int pos) {
        notifyItemChanged(pos);
    }

    public void updateData(int pos, Object payload) {
        notifyItemChanged(pos, payload);
    }

先看第一种:notifyDataSetChanged()

这个就属于暴力刷新了,他会刷新整个可见的item列表。刷新效率很差。我只想要更新某个Item中的TextView,但是这种方式,会导致全部Item列表重新绘制一遍。

    findViewById(R.id.button1).setOnClickListener(v -> {
            int pos = 0;
            Person person = list.get(pos);
            person.name = "update";
            person.age = 44;
            adapter.updateData();
    });

 public void updateData() {
        notifyDataSetChanged();
    }

从日志中可以看出来,这种刷新方式,会把所有的Item重新绘制一遍。

再看第二种刷新方式: notifyItemChanged(pos);

 findViewById(R.id.button2).setOnClickListener(v -> {
            int pos = 0;
            Person person = list.get(pos);
            person.name = "update";
            person.age = 55;
            adapter.updateData(pos);
        });

  public void updateData(int pos) {
        notifyItemChanged(pos);
    }

   这种方式会根据传进来的pos来刷新对应的某一个Item。但是Item中会包含其他的View,

也会导致其他的View跟着刷新,虽然有了较大的优化,但是还是有一些画蛇添足。

看日志:

从日志可以看出,的确刷只刷新了某一个Item。但是整个Item中定义的View也会跟着一起绘制,

会执行onLayout,onMeasure,onDraw三个绘制方式。

我只修改了某个View,只需要重新绘制更新的VIew就行,没有更新的不用跟着计算。

再看第三种方式,

传进去了一个标识,需要在重写onBindViewHolder的重载方法。

 findViewById(R.id.button3).setOnClickListener(v -> {
            int pos = 0;
            Person person = list.get(pos);
            person.name = "payload";
            person.age = 66;
            adapter.updateData(pos, "name");
        });
    public void updateData(int pos, Object payload) {
        notifyItemChanged(pos, payload);
    }

 根据传进来的标识,只改变,需要修改的VIew。前提是要修改的View的大小不会变化,只改变状态,因为Item中其他的View不刷新。如果大小改变的话,可能会导致布局跟着变,这时就得需要item去重新计算来绘制了。

 @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position,             
        @NonNull List<Object> payloads) {
        Log.e("nyz", "onBindViewHolder pos " + position);
        if (!payloads.isEmpty() && payloads.get(0).equals("name")) {
            Log.e("nyz", "update name");
            Person person = list.get(position);
            ((MyViewHolder) holder).nameTv.setText(person.name);
        } else {
            Log.e("nyz", "update item");
            super.onBindViewHolder(holder, position, payloads);
        }

    }

看日志:

确实只修改了需要修改的View,并没有导致整个View进行重新绘制。

代码下载:https://download.csdn.net/download/niuyongzhi/88382724

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在安卓中,可以使用RecyclerView的滚动监听来实现上拉刷新功能。下面是实现步骤: 1. 在你的布局文件中,添加RecyclerView控件: ```xml <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 2. 在你的Activity或Fragment中,找到RecyclerView控件,并设置滚动监听器: ```java RecyclerView recyclerView = findViewById(R.id.recyclerView); recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); // 获取RecyclerView的布局管理器 LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); // 获取列表中最后一个可见的item的位置 int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition(); // 获取列表中的总item数 int totalItemCount = layoutManager.getItemCount(); // 判断是否滚动到了列表底部,并且列表不在加载状态 if (lastVisibleItemPosition == totalItemCount - 1 && !isLoading) { // 加载下一页数据 loadNextPage(); } } }); ``` 在这个示例中,我们使用LinearLayoutManager作为RecyclerView的布局管理器。当滚动到列表的最后一个可见item时,触发加载下一页数据的操作。 3. 在加载下一页数据的方法`loadNextPage()`中,执行你的上拉刷新操作: ```java private void loadNextPage() { // 设置加载状态为true,避免重复加载 isLoading = true; // 这里执行加载下一页数据的操作,比如请求网络数据 // 示例代码: int nextPage = currentPage + 1; // 下一页页码 // 发起网络请求获取下一页数据,可以使用异步操作,比如Retrofit或者Volley // 请求成功后,将新数据添加到RecyclerView的适配器中 // 加载完成后,更新当前页码 currentPage = nextPage; // 设置加载状态为false,表示加载完成 isLoading = false; } ``` 在`loadNextPage()`方法中,你可以执行加载下一页数据的操作,比如发送网络请求获取新数据,并将新数据添加到RecyclerView的适配器中。注意要更新当前页码,并在加载完成后将加载状态设置为false,表示加载完成。 通过设置RecyclerView的滚动监听,当滚动到列表底部时触发加载下一页数据的操作,实现了上拉刷新功能

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

niuyongzhi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值