Очистити вміст перегляду списку?


75

У мене є невелика проблема з ListView. Як очистити ListViewвміст, знаючи, що він має спеціальний адаптер?

edit- спеціальний клас адаптера розширюється BaseAdapter, він виглядає так:

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class MyAdapter extends BaseAdapter {

    private Activity activity;
    private String[] data;
    private static LayoutInflater inflater = null;

    public MyAdapter(Activity a, String[] str) {
        activity = a;
        data = str;
        inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public static class ViewHolder {
        public TextView text;
    }

    @Override
    public int getCount() {
        return data.length;
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

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

    @Override
    public View getView(int position, View view, ViewGroup parent) {
        View v = view;
        ViewHolder holder;
        if (v == null) {
            v = inflater.inflate(R.layout.rowa, null);
            holder = new ViewHolder();
            holder.text= v.findViewById(R.id.dexter);
            v.setTag(holder);
        } else {
            holder = v.getTag();
        }

        holder.text.setText(data[position]);

        return v;
    }

}

Відповіді:


198

Просто напишіть

listView.setAdapter(null);

20
Краще використовувати Adapter.clear () та Adapter.notifyDataSetChanged ()
Бешкенадзе

5
у випадках, коли хтось все ще використовує android 1.6, він зазнає аварії при встановленні нульового або 0-довжинного адаптера.
Пол

2
це чудово працює. хто б використовував android 1.6 все-таки = P дякую mike
NightSkyCode

23
Бешкенадзе - ти змусив мене вийти з Adapter.clear()... просто шкода, що не існує ! : /
Хтось десь

Якщо ви перестаєте ListFragmentвикористовувати, бажаноsetListAdapter(null);
Хорхе Гіл

55

Думаю, ви передали список або масив адаптеру. Якщо ви зберігаєте екземпляр цієї доданої колекції, ви можете зробити файл

collection.clear();
listview.getAdapter().notifyDataSetChanged();

це спрацює, лише якщо ви створили екземпляр адаптера з колекцією, і це той самий екземпляр.

Крім того, залежно від адаптера, який ви розширили, можливо, ви не зможете цього зробити. SimpleAdapter використовується для статичних даних, тому його не можна оновити після створення.

PS. не всі адаптери мають метод clear () . ArrayAdapter робить, але ListAdapter або SimpleAdapter ні


я розширюю BaseAdapter, і я думаю, що він не зрозумів метод ().
Mohamed Gallah

Вам це потрібно, щоб це був BaseAdapter? Якби ви могли перейти на розширення ArrayAdapter, ви отримали б метод clear (). Схоже, що в BaseAdapter вам потрібно використовувати цей registerDataSetObserver (спостерігач DataSetObserver), я думаю, він автоматично оновиться, якщо DataSet зміниться. Але ArrayAdapter, ймовірно, полегшить ситуацію. Удачі!
Maragues

дякую за допомогу, але чи можете ви дати мені зразок коду про те, як розширити ArrayAdapter. Дякую.
Mohamed Gallah

перевірити stackoverflow.com/questions/2265661/... Це справді схоже на те, що у вас вже є.
Maragues

дякую за спільний доступ, але мені здається, що моя проблема не пов'язана з адаптером, оскільки навіть коли я використовую ArrayAdapter's clear () і я перезавантажую діяльність, попередній вміст залишається там на додаток до нового вмісту. у мене справжні проблеми. (Вибачте за погану англійську, сподіваюся, ви зрозуміли).
Мохамед Галла

8

Це просто. Спочатку слід очистити колекцію, а після очищення списку, як цей код:

 yourCollection.clear();
 setListAdapter(null);

3

Що стосується версій Android M і N, наступне працює для мене і було б правильним підходом. Спорожнення ListView або встановлення для адаптера значення null не є правильним підходом і може призвести до проблеми з нульовим покажчиком, недійсного ListView та / або збою програми.

Просто виконайте:

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

тобто спочатку ви повністю очищаєте список, а потім повідомляєте про цю зміну адаптеру. Android подбає про коректне оновлення інтерфейсу з порожнім списком. У моєму випадку мій список - це ArrayList.

Якщо ви виконуєте цю операцію з іншого потоку, запустіть цей код у потоці інтерфейсу користувача:

    runOnUiThread(mRunnable);

Де буде mRunnable:

    Runnable mRunnable = new Runnable() {
        public void run() {
            mList.clear();
            mAdapter.notifyDataSetChanged();
        }
    };;

1

Прості його роботи мене :)

YourArrayList_Object.clear();

Не могли б ви трохи детальніше розказати.
Пантера

ArrayList <DetailsForCallhistoryListActivity> callhistory_details_list; використовуючи цей об’єкт списку об’єктів (тобто callhistory_details_list). callhistory_details_list.clear (); сподіваюся, це допоможе вам. дайте мені знати будь-які запитання
Агіланбу


0

Існує рішення для дубліката запису в списку. Вам потрібно оголосити onBackPress()-метод своєї діяльності та записати код виділення, наведений нижче:

@Override
public void onBackPressed() {
    // TODO Auto-generated method stub
    super.onBackPressed();
    **

    attendence_webdata.clear(); list.setAdapter(null);
    --------------------------------------------------

    **
 }

LOL, звичайно, ні, про який дублікат ви говорите? Яке відношення onBackPress має до очищення адаптерів? Ти взагалі знаєш, про що ти говориш?
грудня

Вибачте за мою англійську, але коли я натискаю кнопку та відкриваю екран для перегляду списку кожного разу, коли він надходить з однаковим записом, тому використовуйте чіткий метод у зворотній пресі
Arpit Patel

0

Просто нанесіть код ListView.Items.Clear();на свій метод


Додайте пояснення з відповіддю на те, як ця відповідь допомагає ОП у вирішенні поточної проблеми
ρяσѕρєя K

-3

clear()Метод виклику з Вашого нестандартного адаптера.


clean () недоступний із BaseAdapter.
Mohamed Gallah

Ви також можете встановити для адаптера listview значення null.
carlovv

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.