如何移除ListView中的所有项

36

在我的应用程序中,如果您单击一个按钮,则我希望删除所有的listview项目。

在这里,我使用基本适配器将项目添加到列表视图中。

如何动态删除listview项目。


1
动态传递getcount,要清除请传递零作为getcount。 - Abhi
7
listview.setAdapter(null); 意思是将 ListView 控件的适配器设置为 null,即清空当前适配器。 - Balaji Khadake
谢谢Abhi,那真的很有帮助。覆盖getCount方法... - slodeveloper
12个回答

39

再次调用 setListAdapter() 。 这次使用一个空的ArrayList。


1
如果您点击按钮,旧数据列表视图项目将被删除,然后新项目将添加到列表视图中。这个可行吗? - naresh
是的,您可以根据需要使用新数据调用setListAdaptor()。 - mah
5
使用新的适配器对象调用setListAdapter()方法会很耗费资源。只需使用clear()方法移除适配器中的所有项,使用add()/addAll()方法将新数据添加到现有的适配器对象中,然后调用notifyDatasetChanged()方法即可。 - JaydeepW

26

ListView 是基于 Adapter 中的底层数据运作的。要清除 ListView,您需要完成两件事:

  1. 清除适配器中设置的数据。
  2. 通过调用 notifyDataSetChanged 来刷新视图。

例如,请参见扩展了 BaseAdapterSampleAdapter 的框架:


public class SampleAdapter extends BaseAdapter {

    ArrayList<String> data;

    public SampleAdapter() {
        this.data = new ArrayList<String>();
    }

    public int getCount() {
        return data.size();
    }

    public Object getItem(int position) {
        return data.get(position);
    }

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

    public View getView(int position, View convertView, ViewGroup parent) {
        // your View
        return null;
    }
}

在这里,你有一个ArrayList<String> data作为适配器的数据。虽然你不一定要使用ArrayList,但在你的代码中,你会有类似的东西来表示ListView中的数据。

接下来,你需要提供一种清除这些数据的方法,实现该方法的方式是清除底层的数据结构。


public void clearData() {
    // clear the data
    data.clear();
}
如果你正在使用任何 Collection 子类,它们将会有一个 clear() 方法,你可以像上面那样使用该方法。

一旦你获得了这个方法,你想在你的 onClick 中调用 clearDatanotifyDataSetChanged,因此 onClick 的代码将会是这样的:


// listView is your instance of your ListView
SampleAdapter sampleAdapter = (SampleAdapter)listView.getAdapter();
sampleAdapter.clearData();

// refresh the View
sampleAdapter.notifyDataSetChanged();

10

如果您使用了List对象并将其传递给Adapter,则可以从List对象中删除该值,然后使用adapter对象调用notifyDataSetChanged()方法。

例如:

List<String> list = new ArrayList<String>();
ArrayAdapter adapter;


adapter = new ArrayAdapter<String>(DeleteManyTask.this, 
            android.R.layout.simple_list_item_1,
            (String[])list.toArray(new String[0]));

listview = (ListView) findViewById(R.id.list);
listview.setAdapter(adapter);

listview.setAdapter(listAdapter);

要删除,请按照以下方式进行操作

list.remove(index); //or
list.clear();
adpater.notifyDataSetChanged();

或者不使用列表对象从列表中删除项。

adapter.clear();
adpater.notifyDataSetChanged();

我正在使用基本适配器,所以我没有clear()方法。如何删除它? - naresh

8
您只能使用
 lv.setAdapter(null);

5
你可以这样做:
listView.setAdapter(null);

4

我使用了这个语句,它对我有用:

   setListAdapter(null)

在一个继承自BaseAdapter的类中,这个调用了一个什么都不做的默认构造函数。


1
这会导致 Android 2.1 崩溃。 - Rafael Sanches

3

我刚刚清空了ArrayList,试着使用了values.clear();

values = new ArrayList<String>();
values.clear();

ArrayAdapter <String> adapter;
adapter = new ArrayAdapter<String>(this, R.layout.list,android.R.id.text1, values); 
lista.setAdapter(adapter);

0
尝试以下解决方案后,另一种方法是:当您需要清除列表时,只需将其初始化为新的清晰的新列表。
List<ModelData> dataLists = new ArrayList<>();
                RaporAdapter adapter = new RaporAdapter(AyrintiliRapor.this, dataLists);
                listview.setAdapter(adapter);

或者根据需要将可见性设置为Gone / Invisible

img_pdf.setVisibility(View.INVISIBLE);

0

对我来说,这是可行的方法:

private ListView yourListViewName;
private List<YourClassName> yourListName;

  ...

yourListName = new ArrayList<>();
yourAdapterName = new yourAdapterName(this, R.layout.your_layout_name, yourListName);

  ...

if (yourAdapterName.getCount() > 0) {
   yourAdapterName.clear();
   yourAdapterName.notifyDataSetChanged();
}

yourAdapterName.add(new YourClassName(yourParameter1, yourParameter2, ...));
yourListViewName.setAdapter(yourAdapterName);

0
请使用以下适合您要求的任何一种选项。
listview.removeViews(1,listview.getChildCount());

或者

listview.removeViewInLayout(your view);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接