清除列表视图内容?


75

我有一个小问题ListView。在ListView知道内容具有自定义适配器的情况下,如何清除其内容?

edit-自定义适配器类extends 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;
    }

}

Answers:


198

只需写

listView.setAdapter(null);

20
最好使用Adapter.clear()和Adapter.notifyDataSetChanged()
beshkenadze 2012年

5
如果仍然有人使用android 1.6,则在设置null或0长度适配器时会崩溃。
保罗

2
这很好。谁会使用android 1.6仍然= P谢谢迈克
NightSkyCode

23
beshkenadze-你让我都退出了Adapter.clear()……可惜的是不存在!:/
某处某人13-10-23

如果您不打算继续ListFragment使用setListAdapter(null);
Jorge Gil

55

我猜您已将列表或数组传递给适配器。如果保留此添加的集合的实例,则可以执行

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

仅当您使用collection实例化适配器时,此方法才有效且它是同一实例时,此方法才有效。

另外,根据您扩展的适配器,您可能无法执行此操作。SimpleAdapter用于静态数据,因此创建后无法更新。

PS。并非所有的适配器都有clear()方法。ArrayAdapter可以,但是ListAdapterSimpleAdapter不能


我正在扩展BaseAdapter,我认为它没有clear()方法。
穆罕默德·加拉

您需要它成为BaseAdapter吗?如果可以切换到扩展ArrayAdapter,则将获得clear()方法。看起来在BaseAdapter中,您需要使用此registerDataSetObserver(DataSetObserver观察器),我想如果DataSet更改,它将自动更新。但是,ArrayAdapter可能会使事情变得更容易。祝好运!
Maragues

感谢您的帮助,但是您能给我一个如何扩展ArrayAdapter的示例代码。谢谢。
穆罕默德·加拉

检查stackoverflow.com/questions/2265661/…确实与您已有的类似。
Maragues

感谢您的共享,但我的问题似乎与适配器无关,因为即使当我使用ArrayAdapter的clear()并重新加载活动时,除新内容外,先前的内容也在那里。我真的很麻烦。(对不起,英语不好,我希望你明白这一点)。
穆罕默德·加拉

8

很简单,首先您应该清除您的收藏集,然后在清除列表后添加如下代码:

 yourCollection.clear();
 setListAdapter(null);

3

从Android版本M和N开始,以下对我有用,并且是正确的方法。清空ListView或将Adapter设置为null是不正确的方法,并且会导致null指针问题,无效的ListView和/或应用程序崩溃。

只需做:

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

即,首先您完全清除列表,然后让适配器知道此更改。Android将负责使用空白列表正确更新UI。就我而言,我的列表是一个ArrayList。

如果要从其他线程执行此操作,请在UI线程上运行以下代码:

    runOnUiThread(mRunnable);

mRunnable在哪里:

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

1

对我来说很简单:)

YourArrayList_Object.clear();

您能否详细说明一下。

ArrayList <DetailsForCallhistoryListActivity> callhistory_details_list; 使用此arraylist对象(即callhistory_details_list)。callhistory_details_list.clear(); 希望对你有帮助。让我知道任何疑问
Agilanbu


0

在列表视图中有一个重复项的解决方案。您必须onBackPress()在活动中声明-method并写下下面给出的突出显示代码:

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

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

    **
 }

大声笑,当然不是,您在说什么重复项?onBackPressed与清除适配器有什么关系?你甚至不知道你在说什么吗?
2Dee 2015年

对不起我的英语,但是当我每次单击按钮并打开屏幕以查看列表视图时,都带有相同的条目,因此请在按回时使用清除方法
Arpit Patel 2015年



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.