【发布时间】: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,因为我在onBindViewHolder和onCreateViewHolder中看不到任何问题 -
在这个 poc 中,它们只是本地文件。此问题与位图无关。它们已正确加载,如果我来回快速滚动,它们都会正确显示。但在这种情况下,不使用 RecyclerView 预取。该问题似乎与预取有关
标签: android-recyclerview android-imageview