RecyclerView滚动到顶部

时间:2015-11-08 00:21:15

标签: android scroll android-recyclerview

您好我有一个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);
    }
}
}

谢谢

2 个答案:

答案 0 :(得分:2)

对我来说,我注意到,如果您对某些视图(在我的情况下为ViewPager和RecyclerViews)使用“ match_parent”而不是对ConstraintsLayout的约束,则会发生此问题。

我已经举报了here

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

答案 1 :(得分:0)

我找到了解决方案。问题是我的ImageView没有固定的大小,它是在下载图片时得到的,这就是为什么当我滚动到顶部时 - 碰巧是所有以前的ImageViews在一个高度为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() {

                }
            });