【问题标题】:Images repeat in recycler view图像在回收站视图中重复
【发布时间】:2016-12-10 10:41:50
【问题描述】:

我有一组图像以随机方式显示在 Recycler View 中。问题是图像重复并且并非所有图像都被使用。我需要的是:所有图像都使用并只显示一次(不重复)。提前感谢您的帮助。

public class Article {
private int mTitle;

private static int[] sTitles = {
        R.drawable.image1a,
        R.drawable.image2a,
        ....
        R.drawable.image30a
};
public Article() {

   Random random = new Random();

// Collections.shuffle(Arrays.asList(sTitles));// 尝试使用这个但没有成功

 mTitle = sTitles[random.nextInt(sTitles.length)];
}
public int getTitle() {
    return mTitle;

}

编辑:我的适配器代码

公共类 MyAdapter 扩展 RecyclerView.Adapter {

private ArrayList<Article> mArticles = new ArrayList<>();

公共 RecyclerView mRecyclerView;

private class MyViewHolder extends RecyclerView.ViewHolder {

    public ImageView mTitle;


    public MyViewHolder(View pItem) {
        super(pItem);

        mTitle = (ImageView) pItem.findViewById(R.id.imageView);
    }
}

public MyAdapter(ArrayList<Article> pArticles, RecyclerView pRecyclerView) {
    mArticles = pArticles;
    mRecyclerView = pRecyclerView;


}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, final int i) {

    View view = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.article_layout, viewGroup, false);

         return new MyViewHolder(view);
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int i) {

    Article article = mArticles.get(i);

    ((MyViewHolder) viewHolder).mTitle.setImageResource(article.getTitle());

}

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

}

【问题讨论】:

  • 你能提供你的适配器代码吗?
  • 在问题中添加了适配器代码

标签: android image random android-recyclerview


【解决方案1】:

将您的文章类更改为:

public class Article {
    private int mTitle;

    private static int[] sTitles = {
            R.drawable.image1a,
            R.drawable.image2a,
            ....
            R.drawable.image30a
    };

    public Article(int title) {
        this.mTitle = title;
    }

    public int getTitle() {
        return mTitle;
    }

    public static ArrayList<Integer> getRandomArticles() {
        ArrayList<Integer> titles = new ArrayList<>();
        ArrayList<Integer> tempTitles = new ArrayList<Integer>(Arrays.asList(sTitles));
        Collections.shuffle(tempTitles);
        for(int title : tempTitles) {
            titles.add(title);
        }
        return titles;
    }
}

然后,当您创建适配器时,将 Article.getRandomArticles() 作为文章列表传递,如下所示:

new MyAdapter(Article.getRandomArticles(), yourRecyclerView);

编辑:忘记了 getRandomArticles 的返回类型

【讨论】:

  • 谢谢尝试一下
  • 我有这个错误 (Array.asList(sTitles));告诉:无法解析符号“数组”。它还将 getRandomArticles 显示为灰色,因为从未使用过。
  • 那是因为我的回答有误,抱歉。它应该是 Arrays.asList 而不是 Array.asList。我编辑了答案
【解决方案2】:

您已经在洗牌阵列,并且再次从该洗牌阵列中挑选随机图像。随机挑选会导致您再次获得相同的图像。因此,只需按照打乱顺序从阵列中挑选图像。无需选择随机图像。

编辑:

将您的数组更改为列表并尝试以下操作:

public static ArrayList<Integer> sTitles = new ArrayList<Integer>();
sTitles.add(R.drawable.image1a);
.
.
.
.
sTitles.add(R.drawable.image30a);
Collections.shuffle(sTitles );

【讨论】:

  • 当我有没有 Collections.shuffle 的代码时,它就像我描述的那样发生。但是当我随机删除时,Collection.shuffle 本身根本不起作用,并且会显示任何图片。