您好我有一个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);
}
}
}
谢谢
答案 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() {
}
});