Recyclerview的第一项重复两次

时间:2018-09-27 19:05:14

标签: android android-recyclerview

我正在尝试显示特定文件夹中的图像(3张图像),并使用以下代码将其存储在Recyclerview中,但是Recyclerview的第一项重复两次,出现在第一和最后项目和最后一个项目未显示,如下图所示:

enter image description here

MyAdapter

public class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {

    Context c;
    ImageView img;
    ArrayList<Spacecraft> spacecrafts;

    public MyAdapter(Context c, ArrayList<Spacecraft> spacecrafts) {
        this.c = c;
        this.spacecrafts = spacecrafts;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(c).inflate(R.layout.picture_item, parent, false);
        img = (ImageView) v.findViewById(R.id.cat_imageView);
        return new MyViewHolder(v);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public int getItemViewType(int position) {
        return position;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        Spacecraft s = spacecrafts.get(position);
        Glide.with(c).load(s.getUri()).into(img);
    }

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

}

MainActivity

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity);
        /**/
        recyclerView = (RecyclerView) findViewById(R.id.rc);
        layoutManager = new GridLayoutManager(WallpaperAutoChanger.this, 2);
        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setHasFixedSize(true);
        recyclerView.setAdapter(new MyAdapter(this, getData()));
       /**/
}
}
  private ArrayList<Spacecraft> getData() {
        ArrayList<Spacecraft> spacecrafts = new ArrayList<>();
        File downloadsFolder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES + "/wallpapers");
        Spacecraft s;
        if (downloadsFolder.exists()) {
            File[] files = downloadsFolder.listFiles();
            for (File file : files) {
                s = new Spacecraft();
                s.setName(file.getName());
                s.setUri(Uri.fromFile(file));
                spacecrafts.add(s);
            }
        }
        return spacecrafts;
    }

有人可以帮助我解决此问题。

1 个答案:

答案 0 :(得分:0)

img更改为局部变量。它不应该是全球性的。您可以像这样将其初始化移至onBindViewHolder()中:

ImageView img = (ImageView) holder.itemView.findViewById(R.id.cat_imageView);

然后在您使用它的地方调用它。

我不确定,因为我没有看过源代码,但是我不认为可以保证在索引onBindViewHolder被调用之前onCreateViewHolder被索引0调用1(它们不是顺序的),这意味着您的img变量使用了错误的赋值。