RecyclerView使用setHasStableIds(true); 数据错乱

四、notifyDataSetChanged时导致图片闪烁

这个问题比较好解决,一句代码,

mRecyclerViewAdapter.setHasStableIds(true);  
  • 1

要注意,使用上述代码的话,Adapter中的getItemId要重写成如下,如果仍用super.getItemId(position),数据刷新会出错。

  @Override
    public long getItemId(int position) {
        return position;
    }
  • 1
  • 2
  • 3
  • 4

从源码角度来看,相当于我们平时给ImageView和图片做了一个tag绑定,检测到是url没变时,不再重新加载图片,也就不用重新计算、绘制,这样就避免了图片闪烁

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RecyclerView 列表分页加载数据的基本思路是,在滚动到列表底部时触发加载下一页数据的操作。一般来说,我们需要维护以下几个变量: - currentPage:当前已加载的页数; - totalPage:总页数; - isLoading:是否正在加载数据; - isLastPage:是否已经加载完所有数据。 具体实现步骤如下: 1. 在 RecyclerView 的滚动事件中判断是否滚动到了列表底部。 ```java recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); int visibleItemCount = linearLayoutManager.getChildCount(); int totalItemCount = linearLayoutManager.getItemCount(); int firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition(); if (!isLoading && !isLastPage) { if (visibleItemCount + firstVisibleItemPosition >= totalItemCount && firstVisibleItemPosition >= 0) { loadNextPage(); } } } }); ``` 2. 在 loadNextPage() 方法中执行加载下一页数据的操作。 ```java private void loadNextPage() { isLoading = true; currentPage++; // 调用 API 加载下一页数据 apiService.getNextPageData(currentPage).enqueue(new Callback<DataResponse>() { @Override public void onResponse(Call<DataResponse> call, Response<DataResponse> response) { if (response.isSuccessful()) { List<Data> data = response.body().getData(); // 将新数据添加到列表中 dataList.addAll(data); adapter.notifyDataSetChanged(); isLoading = false; if (currentPage == totalPage) { isLastPage = true; } } else { // 加载失败 Toast.makeText(getContext(), "Failed to load data.", Toast.LENGTH_SHORT).show(); isLoading = false; } } @Override public void onFailure(Call<DataResponse> call, Throwable t) { // 加载失败 Toast.makeText(getContext(), "Failed to load data.", Toast.LENGTH_SHORT).show(); isLoading = false; } }); } ``` 3. 在调用 API 加载下一页数据的时候,需要将 currentPage 加 1,并且在加载成功后判断是否已经加载完所有数据。 ```java if (currentPage == totalPage) { isLastPage = true; } ``` 这里需要注意的是,totalPage 的值需要在第一次加载数据时从 API 中获取,或者在第一次加载成功后计算得出。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值