RecyclerView .add () работает без вызова .notifyDataSetChanged () после инициализации адаптера - PullRequest
1 голос
/ 23 марта 2020

В моем адаптере почему .add() работает, хотя я уже установил адаптер?

mFilePathImages = new ArrayList<>();
mGridAdapter = new HomeGridAdapter(mContext, mFilePathImages);    
mGridRecycler.setLayoutManager(gridLayoutManager);
mGridRecycler.setAdapter(mGridAdapter);

mFilePathImages.add("https://i.redd.it/lawrnev8v8o41.jpg");
mFilePathImages.add("https://i.imgur.com/GQXyo34.jpg");

Разве он не должен работать, только если я позвонил .notifyDataSetChanged?

Я проверил Мой адаптер, чтобы увидеть, было ли .notifyDataSetChanged, но не было.

Вот полный адаптер для Recycler:

public class HomeGridAdapter extends RecyclerView.Adapter<HomeGridAdapter.ViewHolder> {

    private static final String TAG = "GridViewAdapter";

    private Context mContext;
    private ArrayList<String> mList;


    public HomeGridAdapter(Context context, ArrayList<String> list) {
        this.mContext = context;
        this.mList = list;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.vh_fraghome_griditem, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int i) {
        Glide.with(mContext)
                .load(mList.get(i))
                .apply(RequestOptions.centerCropTransform())
                .into(holder.vhSquareImage);
    }

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


    public class ViewHolder extends RecyclerView.ViewHolder {
        @BindView(R.id.vh_fraghome_squareimageview)
        SquareImageView vhSquareImage;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            ButterKnife.bind(this, itemView);
        }
    }
}
```

Кто-нибудь знает, что вызвало проблему

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

Java всегда передается по значению. К сожалению, когда мы передаем значение объекта, мы передаем ссылку на него, как вы сделали это здесь:

 new HomeGridAdapter(mContext, mFilePathImages); 

, поэтому теперь, когда вы изменяете свой массив mFilePathImages, это также влияет на адаптер .

Для лучшего разъяснения см. Этот ответ: { ссылка }

, чтобы избежать этой ситуации, вы должны передать массив после получения окончательных данных (или любых изменений во время выполнения) , Для адаптера сделайте список изначально пустым.

всякий раз, когда у вас есть окончательные данные, отправляйте их на адаптер как:

public void updateData(ArrayList<String> list) {
    if (list!= null) {
        this.list.clear();
        this.list.addAll(list);
        notifyDataSetChanged();
    }
}
0 голосов
/ 23 марта 2020

Могу предположить, что это связано с тем, что этот код

mFilePathImages.add("https://i.redd.it/lawrnev8v8o41.jpg");
mFilePathImages.add("https://i.imgur.com/GQXyo34.jpg");

выполняется быстрее, чем начинается процесс создания представления для recyclerView, поэтому вызов notifyDataSetChanged не требуется. Поэтому работает, но не факт, что он будет работать каждый раз, поэтому вы должны вызвать notifyDataSetChanged

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...