recycler 刷新图片闪烁,在notifyDatasetChanged()之后RecyclerView闪烁

I have a RecyclerView which loads some data from API, includes an image url and some data, and I use networkImageView to lazy load image.

@Override

public void onResponse(List response) {

mItems.clear();

for (Item item : response) {

mItems.add(item);

}

mAdapter.notifyDataSetChanged();

mSwipeRefreshLayout.setRefreshing(false);

}

Here is implementation for Adapter:

public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) {

if (isHeader(position)) {

return;

}

// - get element from your dataset at this position

// - replace the contents of the view with that element

MyViewHolder holder = (MyViewHolder) viewHolder;

final Item item = mItems.get(position - 1); // Subtract 1 for header

holder.title.setText(item.getTitle());

holder.image.setImageUrl(item.getImg_url(), VolleyClient.getInstance(mCtx).getImageLoader());

holder.image.setErrorImageResId(android.R.drawable.ic_dialog_alert);

holder.origin.setText(item.getOrigin());

}

Problem is when we have refresh in the recyclerView, it is blincking for a very short while in the beginning which looks strange.

I just used GridView/ListView instead and it worked as I expected. There were no blincking.

configuration for RecycleView in onViewCreated of my Fragment:

mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);

// use this setting to improve performance if you know that changes

// in content do not change the layout size of the RecyclerView

mRecyclerView.setHasFixedSize(true);

mGridLayoutManager = (GridLayoutManager) mRecyclerView.getLayoutManager();

mGridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {

@Override

public int getSpanSize(int position) {

return mAdapter.isHeader(position) ? mGridLayoutManager.getSpanCount() : 1;

}

});

mRecyclerView.setAdapter(mAdapter);

Anyone faced with such a problem? what could be the reason?

解决方案

Try using stable IDs in your RecyclerView.Adapter

setHasStableIds(true) and override getItemId(int position).

Without stable IDs, after notifyDataSetChanged(), ViewHolders usually assigned to not to same positions. That was the reason of blinking in my case.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值