【问题标题】:RecyclerView scrolls to the top itselfRecyclerView 自己滚动到顶部
【发布时间】:2020-05-27 18:10:04
【问题描述】:

您好,我有一个 RecyclerView,用于在两列中显示图像。电影的 ArrayList 包含 60 个图像的 URL 字符串。因此图像可以很好地加载到 ImageViews 中。当我向下滚动时,一切正常且流畅,然后我到达底部并向上滚动,有一段时间它滚动正常,但随后它滚动到最顶部,我实际上看到了尝试加载之间的所有照片。我寻找了这个问题,但没有找到这个滚动问题的原因。 但是,如果我的列表中只有 20 项,那么一切都会很好

这是适配器的代码:

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {
private ArrayList<Movie> movies;
private Context context;
private int newWidth;
private int newHeight;

public CustomAdapter(ArrayList<Movie> movies, Context context) {
    this.movies = movies;
    this.context = context;
    int screenWidth = context.getResources().getDisplayMetrics().widthPixels;
    int orientation = context.getResources().getConfiguration().orientation;
    newWidth = screenWidth / (orientation == Configuration.ORIENTATION_LANDSCAPE ? 3 : 2);
    newHeight = (int) (((double) newWidth / 185) * 278);

}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_movie, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {

    Picasso.with(context)
            .load(movies.get(position).url)
            .resize(newWidth, newHeight)
            .into(holder.imageView);
}

@Override
public int getItemCount() {
    return movies.size();
}

public static class ViewHolder extends RecyclerView.ViewHolder {
    final ImageView imageView;

    public ViewHolder(View itemView) {
        super(itemView);
        imageView = (ImageView) itemView.findViewById(R.id.pic);
    }
}
}

谢谢

【问题讨论】:

  • 我遇到了同样的问题,但是在向 Picasso 添加标签后它起作用了。尝试这样:Picasso.with(context) .load(IMAGE_BASE + W_185 + movies.get(position).image) .resize(newWidth, newHeight) .tag(context) .into(holder.image);
  • @TdSoft 嗯,保持不变
  • 请您尝试不同的库,如 Glide(谷歌也推荐使用 Glide)。请参阅此网址inthecheesefactory.com/blog/…,我认为该帖子中的“磁盘缓存”部分将解决您的问题。
  • @TdSoft 是的,带有 Glide 看起来好多了,还有一些,但看起来像 Image Loader 库是问题所在。谢谢
  • 你在 Glide(.diskCacheStrategy(DiskCacheStrategy.ALL)) 中尝试过磁盘缓存策略

标签: android scroll android-recyclerview


【解决方案1】:

对我而言,我注意到如果您对某些视图(在我的情况下为带有 RecyclerViews 的 ViewPager)使用“match_parent”而不是 ConstraintsLayout 的约束,则可能会出现此问题。

我已经举报了here

目前,我的解决方法/修复是设置约束。

【讨论】:

  • 我面临同样的问题,但约束也无法解决问题
  • @MahmoudMabrok 你可以创建一个 POC 并在我报告的问题上分享它,或者创建一个新的,以防它太不同。
  • 问题正在使用我现在的想法(我在删除它后使用 SwipRefresh 应用工作正常)
  • @MahmoudMabrok 我不明白。同样,如果您可以在 POC 上重现它,请报告它。
  • 天哪,谢谢,将我的 ViewPager2 上的高度设置为 0dp 并设置约束解决了这个问题。花了数周的时间来解决这个问题。
【解决方案2】:

我找到了解决方案。问题是我的 ImageView 没有固定大小,它是在下载图片时得到的,这就是为什么当我滚动到顶部时 - 恰好有所有以前的 ImageView在一个高度为 0 且没有图片的屏幕中,但是当下载图片时,ImageView 的大小会扩展,看起来 RecyclerView 会滚动到可见 ImageView 的第一个。

所以我将此代码添加到我的 CustomAdapter

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_movie, parent, false);
    ImageView viewById = (ImageView) view.findViewById(R.id.poster);
    viewById.setMinimumWidth(newWidth);
    viewById.setMinimumHeight(newHeight);
    return new ViewHolder(view);
} 

这就是我在实际下载图片之前将 ImageView 大小更改为我想要的大小的方法。

还添加了一个 ProgressBar 以看起来更好。

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
    holder.progressBar.setVisibility(View.VISIBLE);

    Picasso.with(context)
            .load(movies.get(position).postersUrl)
            .resize(0, newHeight)
            .noFade()
            .into(holder.imageView, new Callback() {
                @Override
                public void onSuccess() {
                    holder.progressBar.setVisibility(View.INVISIBLE);
                }

                @Override
                public void onError() {

                }
            });

【讨论】:

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