Подтвердить что ты не робот

Удалить все элементы из RecyclerView

Я пытаюсь удалить все элементы из моего RecyclerView в моем методе onRestart чтобы элементы не загружались дважды:

@Override
protected void onRestart() {
    super.onRestart();

    // first clear the recycler view so items are not populated twice
    for (int i = 0; i < recyclerAdapter.getSize(); i++) {
        recyclerAdapter.delete(i);
    }

    // then reload the data
    PostCall doPostCall = new PostCall(); // my AsyncTask... 
    doPostCall.execute();
}

Но по какой-то причине метод delete который я создал в adapter, не работает должным образом:

в RecyclerAdapter.java:

public void delete(int position){
    myList.remove(position);
    notifyItemRemoved(position);
}

public int getSize(){
    return myList.size();
}

Я думаю, что все остальные элементы в моем списке будут удалены вместо всего списка.

Со listview это было так просто, и я просто назвал adapter.clear().

Может кто-нибудь, пожалуйста, помогите мне исправить код?

Я думаю, что я должен использовать notifyItemRangeRemoved(...,...); но я не уверен как. ТИА

4b9b3361

Ответ 1

Это прекрасно работает для меня:

public void clear() {
    int size = data.size();
    if (size > 0) {
        for (int i = 0; i < size; i++) {
            data.remove(0);
        }

        notifyItemRangeRemoved(0, size);
    }
}

Источник: https://github.com/mikepenz/LollipopShowcase/blob/master/app/src/main/java/com/mikepenz/lollipopshowcase/adapter/ApplicationAdapter.java

или же:

public void clear() {
    int size = data.size();
    data.clear();
    notifyItemRangeRemoved(0, size);
}

Для тебя:

@Override
protected void onRestart() {
    super.onRestart();

    // first clear the recycler view so items are not populated twice
    recyclerAdapter.clear();

    // then reload the data
    PostCall doPostCall = new PostCall(); // my AsyncTask... 
    doPostCall.execute();
}

Ответ 2

Избегайте удаления ваших элементов в цикле for и вызова notifyDataSetChanged на каждой итерации. Вместо этого просто вызовите метод clear из вашего списка myList.clear(); а затем уведомить ваш адаптер

public void clearData() {
    myList.clear(); // clear list
    mAdapter.notifyDataSetChanged(); // let your adapter know about the changes and reload view.
}

Ответ 3

setAdapter(null);

Полезно, если RecycleView имеет разные типы просмотров

Ответ 4

recyclerView.removeAllViewsInLayout();

Приведенная выше строка поможет вам удалить все виды из макета.

Для тебя:

@Override
protected void onRestart() {
    super.onRestart();

    recyclerView.removeAllViewsInLayout(); //removes all the views

    //then reload the data
    PostCall doPostCall = new PostCall(); //my AsyncTask... 
    doPostCall.execute();
}

Ответ 5

Вот как я очистил свой recyclerview и добавил к нему новые предметы с анимацией:

mList.clear();
mAdapter.notifyDataSetChanged();

mSwipeRefreshLayout.setRefreshing(false);

//reset adapter with empty array list (it did the trick animation)
mAdapter = new MyAdapter(context, mList);
recyclerView.setAdapter(mAdapter);

mList.addAll(newList);
mAdapter.notifyDataSetChanged();

Ответ 6

Помогите себе:

public void clearAdapter() {
    arrayNull.clear();
    notifyDataSetChanged();
}

Ответ 7

Еще один способ очистки элементов recycleview - создать новый пустой адаптер.

mRecyclerView.setAdapter(new MyAdapter(this, new ArrayList<MyDataSet>()));

Это, вероятно, не самое оптимизированное решение, но оно работает как шарм.

Ответ 8

ListView использует clear().

Но, если вы просто делаете это для RecyclerView. Сначала вам нужно очистить RecyclerView.Adapter с помощью notifyItemRangeRemoved(0,size)

Тогда только вы recyclerView.removeAllViewsInLayout().

Ответ 9

private void clearRecyclerView() {
    CustomListViewValuesArr.clear();
    customRecyclerViewAdapter.notifyDataSetChanged();
}

использовать эту функцию

Ответ 10

На Xamarin.Android, у меня работает и нужно менять макет

 var layout = recyclerView.GetLayoutManager() as GridLayoutManager;
 layout.SpanCount = GetItemPerRow(Context);
 recyclerView.SetAdapter(null);
 recyclerView.SetAdapter(adapter); //reset

Ответ 11

Для моего случая добавление пустого списка сделало работу.

List<Object> data = new ArrayList<>();
adapter.setData(data);
adapter.notifyDataSetChanged();

Ответ 12

public void clearData() {
    mylist.removeAll(mylist);
    mAdapter.notifyDataSetChanged();
    recyclerView.setAdapter(mAdapter);
}