NotifyDataSetChanged RecyclerView вообще не работает

Я использую RecyclerView, чтобы показать данные, полученные после анализа веб-служб. Проблема в том, что notifydatasetchanged вообще не работает. Для решения этой проблемы я снова устанавливаю адаптер.

У меня две проблемы с использованием этой техники:

  1. При установке нового адаптера снова мигает экран.

  2. Также вид ресайклера указывает на первый элемент вида ресайклера. (Я просто хочу добавить новые данные в конец существующего списка. Размер списка массивов обновляется. Но единственная проблема, список начинается с нулевой позиции.)

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_book_mag_list_child, container, false);
        recyclerView = (RecyclerView) view.findViewById(R.id.bookMagRecyclerViewList);
        bookMagDataList = new ArrayList<>();
        adapter = new BookMagListRecyclerViewAdapter(getActivity(), bookMagDataList);
        recyclerView.setAdapter(adapter);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
        //linearLayoutManager.setStackFromEnd(true);
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setOnScrollListener(new EndlessRecyclerScrollListener(linearLayoutManager) {
            @Override
            public void onLoadMore(int current_page) {
                Log.d("Do Something", "Do Something" + current_page);
                params.setStart("" + current_page);
                dataModel.init(params);
            }
        });
        return view;
    }
    
    
    
    
    @Override
    public void update() {
        if (dataModel.getFragmentData(subScreenId) != null) {
            bookMagDataList = dataModel.getFragmentData(subScreenId);
            Log.d("MyDataListSize: ", "" + bookMagDataList.size());
            adapter = new BookMagListRecyclerViewAdapter(getActivity(), bookMagDataList);
            recyclerView.setAdapter(adapter);
    
        }
    }
    

Пожалуйста, проверьте, в чем проблема, и дайте мне знать, можно ли ее решить.


person Gaurav Arora    schedule 02.02.2016    source источник
comment
У меня есть лучший способ. Просто добавьте новые данные в старый список в Adapter class и вызовите из него notifyDataSetChanged();.   -  person M D    schedule 02.02.2016
comment
Я сделал то же самое. То же самое мы делаем в списке. Вы использовали с recycler view?   -  person Gaurav Arora    schedule 02.02.2016
comment
Если вы хотите, чтобы мы решили проблему, покажите проблему, а не обходной путь.   -  person Guillaume Imbert    schedule 02.02.2016
comment
Да, сделал то же самое с recycler View   -  person M D    schedule 02.02.2016
comment
У меня есть массив, у которого есть новые данные каждый раз, когда я просматриваю список. Так он вообще не обновляется.   -  person Gaurav Arora    schedule 02.02.2016
comment
Если вы просто хотите добавить элемент в конце, попробуйте использовать bookMagDataList.add(position, data); а затем вызовите notifyItemInserted(position); Нет необходимости вызывать notifyDataSetChanged()   -  person Jyotman Singh    schedule 02.02.2016
comment
проверь мой ответ сделай так   -  person M D    schedule 02.02.2016
comment
Я хочу каждый раз добавлять по 20 элементов @JyotmanSingh   -  person Gaurav Arora    schedule 02.02.2016
comment
Затем сначала добавьте все элементы в список, как указано выше, и используйте notifyItemRangeInserted(int positionStart, int itemCount), где начальная позиция — это позиция, с которой вы начинаете вставлять, а itemCount — количество вставленных элементов.   -  person Jyotman Singh    schedule 02.02.2016
comment
Пожалуйста, напишите также код адаптера.   -  person Mustansar Saeed    schedule 02.02.2016


Ответы (5)


Проблема в вашей функции обновления. Вы переопределяете список bookMagDataList новым экземпляром каждый раз при обновлении. Вы должны использовать функцию .addAll() для добавления нового элемента. Затем вызовите adapter.notifyDataSetChanged() после этого. Внесите изменения, как показано ниже.

 @Override
    public void update() {
        if (dataModel.getFragmentData(subScreenId) != null) {
            bookMagDataList.addAll(dataModel.getFragmentData(subScreenId));
            Log.d("MyDataListSize: ", "" + bookMagDataList.size());
            adapter.notifyDataSetChanged();
        }
    }
person kopikaokao    schedule 02.02.2016
comment
@Gaurav, почему ты хранишь bookMagDataList во фрагменте? ваш внутренний класс адаптера? - person JAAD; 02.02.2016
comment
@ankitagrawal, может быть, активность, в которой размещен фрагмент, не заинтересована в том, чтобы знать реализацию фрагмента? Это максимизирует повторное использование деятельности. - person kopikaokao; 02.02.2016
comment
@styx я говорю не об активности, а о фрагменте и адаптере, в идеале у фрагмента не должно быть данных, но у адаптера должен быть - person JAAD; 02.02.2016
comment
@ankitagrawal В идеале да. Реализация чтения/обновления/вставки/удаления также должна быть инкапсулирована в адаптере. Из-за плохого дизайна я полагаю? - person kopikaokao; 02.02.2016
comment
я догадываюсь, как реализовать, он решил свою проблему, так что не беспокойтесь - person JAAD; 02.02.2016
comment
@ankitagrawal правда! Здоровья, приятель! - person kopikaokao; 02.02.2016

поскольку вы не опубликовали свой код адаптера, вам нужно использовать подход styx:

@Override
public void update() {
    if (dataModel.getFragmentData(subScreenId) != null) {
        bookMagDataList.addAll(dataModel.getFragmentData(subScreenId));
        Log.d("MyDataListSize: ", "" + bookMagDataList.size());
        adapter.notifyDataSetChanged();
    }
}

ответ дает стикс, так что ему спасибо

person JAAD    schedule 02.02.2016
comment
Зачем переопределять его новым экземпляром, если вы можете просто добавить обновленное значение в исходный список, используя функцию bookMagDataList.addAll()? Напоминание: исходный список находится во фрагменте, где адаптер хранит только ссылку на него. - person kopikaokao; 02.02.2016
comment
я переопределил его новым экземпляром, я просто повторно использую тот же адаптер, пожалуйста, посмотрите код - person JAAD; 02.02.2016
comment
кроме того, мы не знаем, хранит ли он ссылку или нет в адаптере, поскольку он не опубликовал код адаптера, а также вы предполагаете, что мы этого не знаем. - person JAAD; 02.02.2016
comment
@ankitagrawal: если он не опубликовал код адаптера, мы должны попросить его опубликовать - person Mustansar Saeed; 02.02.2016
comment
Если адаптер не сохраняет ссылку на список, то как адаптер должен отображать данные? - person kopikaokao; 02.02.2016
comment
адаптер обычно поддерживает локальный массив, но, поскольку он не опубликовал, мы еще не знаем об этом - person JAAD; 02.02.2016
comment
постарайся объяснить - person JAAD; 02.02.2016

мое решение ниже

if (adapter == null) {
    adapter = new BookMagListRecyclerViewAdapter(getActivity(), bookMagDataList);
    recyclerView.setAdapter(adapter);
  } else {
    adapter.bookMagDataList.clear();
    adapter.bookMagDataList = bookMagDataList;
    myAdapter.notifyDataSetChanged()
  }
person denizs    schedule 05.02.2018

Не создавайте экземпляр адаптера снова, только вы должны добавить новые данные в arrayList, а затем вызвать notifyDatasetChanged()

как--

bookMagDataList.add("YOUR ITEM");
adpter.notifyDatasetChanged();
person Pawan Kumar Chaurasia    schedule 02.02.2016

вы должны сделать, как показано ниже в методе update,

if(adapter == null){
    adapter = new BookMagListRecyclerViewAdapter(getActivity(), bookMagDataList);
    recyclerView.setAdapter(adapter);
}else{
    myAdapter.notifyDataSetChanged();
}
person Dhaval Parmar    schedule 02.02.2016