【问题标题】:ImageView seem to be recycled as soon they leave the screen in a RecyclerViewImageView 似乎在 RecyclerView 离开屏幕后立即被回收
【发布时间】:2019-05-09 03:10:34
【问题描述】:

我刚开始使用 RecyclerView 来显示一些包含 ImageView 和 TextView 的行。 当我打开屏幕时,一切都正确显示。如果我快速滚动到列表底部然后快速备份没有问题。 但是,一旦我慢慢向下滚动以显示下一行并且第一行不再显示,向上滚动将显示一个黑色方块而不是我的位图。

我认为在向上滚动时会再次调用 onBindViewHolder(),但这只会在滚动 3 行后发生。 所以看起来 RecyclerView 正在预取一些行

我尝试调用 setItemPrefetchEnabled(false);在 layoutManager 或 setInitialPrefetchItemCount(0) 上; 但它不会改变任何东西

知道发生了什么以及如何解决这个问题吗?

我正在做一个戳,所以这里的代码是最少的

// 片段

final RecyclerView view = this.fragmentView.findViewById(R.id.recyclerView);
view.setHasFixedSize(true);
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
//layoutManager.setItemPrefetchEnabled(false);
//layoutManager.setInitialPrefetchItemCount(0);
view.setLayoutManager(layoutManager);
MyAdapter adapter = new MyAdapter(data);
view.setAdapter(adapter);

// 视图持有者

    public class MyViewHolder extends RecyclerView.ViewHolder {

        ImageView thumbnail;
        TextView name;

        public MyViewHolder(@NonNull View itemView) {
            super(itemView);
        }
}

// 适配器

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // create a new view
    final View view = LayoutInflater.from(parent.getContext()).inflate(R.id.my_layout, parent, false);
    final MyViewHolder viewHolder = buildViewHolder(view);
    view.setTag(viewHolder);        
    return viewHolder;
}

@Override
public void onBindViewHolder(MyViewHolder viewHolder, int position) {
    final MyData myData = this.data.get(position);
    viewHolder.name.setText(myData.getName());
    viewHolder.thumbnail.setImageBitmap(getBitmap(myData.getThumbnailPath()));
}

private MyViewHolder buildViewHolder(View view) {
    final MyViewHolder viewHolder = new MyViewHolder(view);
    viewHolder.name = view.findViewById(R.id.name);
    viewHolder.thumbnail = view.findViewById(R.id.thumbnail);
    return viewHolder;
}

【问题讨论】:

  • buildViewHolder(View view) 是做什么的?
  • 我添加了缺失的代码,但我认为这无助于理解造成这种情况的原因
  • 位图从何而来?保存在本地预构建,或者您可以从服务器下载它?也许问题出在getBitmap,因为我在onBindViewHolderonCreateViewHolder 中看不到任何问题
  • 在这个 poc 中,它们只是本地文件。此问题与位图无关。它们已正确加载,如果我来回快速滚动,它们都会正确显示。但在这种情况下,不使用 RecyclerView 预取。该问题似乎与预取有关

标签: android-recyclerview android-imageview


【解决方案1】:

我没有正确理解您的问题,也无法发表评论。 但是,如果您的问题是视图被回收,请尝试:

holder.setIsRecyclable(false).

onBindViewHolder()里面 这告诉“嘿,recyclerview,停止回收这么多视图”

【讨论】:

  • ViewHolder 应该被回收,这不是问题。问题是它们在离开屏幕时没有被回收(除非离开屏幕 3 行或更多行),但之后它们的 imageview 没有正确显示
  • 您确定在创建视图时图像数据加载正确吗?
【解决方案2】:

看起来像在打电话

this.view.setItemViewCacheSize(0);

在我的 RecyclerView 上解决了这个问题,但我不明白为什么这是必要的。 我仍然想了解这里发生了什么

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    相关资源
    最近更新 更多