android - RecyclerView 消失的图片

标签 android android-recyclerview

我想要创建的是一个水平滚动的图片库。我有一个 RecyclerView(支持 22.0.0)。我遇到的问题是,当我滚动到末尾然后向后滚动时,通常会丢失一张图像,有时会丢失两张。奇怪的是,当我不断来回滑动时,可能会丢失不同的图像。这是项目的布局:

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="160dp">

<ImageView
    android:id="@+id/product_variation_image"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scaleType="centerCrop"
    android:layout_gravity="center"/>

这是 Adaper:

public class TestAdapter extends RecyclerView.Adapter<TestAdapter.ViewHolder> {
private String[] mDataset;

public static class ViewHolder extends RecyclerView.ViewHolder {

    public ImageView mImageView;
    public ViewHolder(View v) {
        super(v);
        mImageView = (ImageView) v.findViewById(R.id.product_variation_image);
    }
}

public TestAdapter(String[] myDataset) {
    mDataset = myDataset;
}

@Override
public TestAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
                                               int viewType) {
    // create a new view
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.variaton_list_item, parent, false);
    ViewHolder vh = new ViewHolder(v);
    return vh;
}

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

    holder.mImageView.setImageDrawable(null);
    String url = mDataset[position];
    Log.i("TEST", "position = " + position);
    ((MainActivity)MainActivity.getInstance()).imageDownloader.download(url, holder.mImageView);
}

@Override
public int getItemCount() {
    return mDataset.length;
}

下载方法从 URL 或从内存中获取图像(如果已缓存)。这适用于所有其他布局,例如 ListView 或 GridView 。这是我用来在 Fragment 中设置它的代码:

    final LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
    layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
    mRecyclerView.setLayoutManager(layoutManager);

这是在 onCreateView 方法中。当我得到 url 时,我填充它们并使用以下方法设置适配器:

  myDataset[i] = imageURL; // for each image       
  mAdapter = new TestAdapter(myDataset);
  mRecyclerView.setAdapter(mAdapter);

有趣的是适配器中 onBindViewHolder 方法中的那一行,我在其中记录了位置。我发现未显示图像的单元格未调用此方法。就好像它出于某种原因正在跳过那个单元格。更奇怪的是,如果我按住一个单元格并从左向右滑动,如果一个单元格离开屏幕然后又回来,它的图像就会消失,因为不会调用 onBindViewHolder 方法。

最佳答案

是否可以测试一些东西?您可以使用此库从 URL 加载图像吗? http://square.github.io/picasso/它缓存所有内容并以异步方式处理所有内容。

使用类似...

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

    Picasso.with(mImageView.getContext()).cancelRequest(holder.mImageView);

    String url = mDataset[position];
    Picasso.with(mImageView.getContext()).load(url).placeholder(R.drawable.placeholder).into(holder.mImageView);

}

... 看看它是否仍然不显示某些图像。如果确实如此,那么至少您可以 100% 确定问题不在您的下载机制中(我认为可能是)。

如果您使用的是 Android Studio,那么只需添加依赖项 compile 'com.squareup.picasso:picasso:2.5.2',如果没有,您可以添加您在上面的链接中找到的库。

值得一试...

关于android - RecyclerView 消失的图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29564824/

相关文章:

android - RecyclerView Drawer - 设置选择

安卓 : RecyclerView row Visibility not working properly

android - android tabwidget 的现有补丁允许左侧的标签?

android - RecyclerView 和 IndexOutOfBoundsException : Invalid index #, 大小是#

java - 将字符串发送到 RecyclerViewHolder 中的 onClick

java - 滚动时移动 RecyclerView

android - RecyclerView item 填满整个屏幕

android - 测试 android 时出现 FitNesse 错误 : "Could not invoke constructor for .." & "The instance ... does not exist"

android - 设置 headless 设备以连接到 wifi 网络

java - 如何使用Button自动向Firebase进行身份验证 - Java