自定义ArrayList Adapter.clear()不起作用

时间:2012-02-18 12:20:01

标签: android listadapter

我正在使用ListView来显示搜索结果。我有一个Coustomized arrayListAdapter,它返回一个Objects列表。这工作正常。我的listView只显示了一个TextView。

但是当我再次访问搜索页面时,我想清除列表。我试过了

@Override
protected void onResume()
{
    mListAdapter.clear();
    mListAdapter.notifyDataSetChanged();
    super.onResume();
}

和SearchListAdapter

public class SearchListAdapter extends ArrayAdapter<Chapter>
{
public Context context;
private static String searchText = null;

public SearchListAdapter(Context context)
{
    super(context, R.layout.favorite_tab_list_view_row);
    this.context = context;
}

@Override
public void clear()
{
    for (int i = 0; i < getCount(); i++)
        getSearchChapters().remove(i);
    notifyDataSetChanged();
    super.clear();
}

private ArrayList<Chapter> getSearchChapters()
{
    ArrayList<Chapter> chapter = new ArrayList<Chapter>();
    if (searchText != null)
        for (int i = 0; i < DataStore.getHierarchicalChapters()
                .getSubChapters().size(); i++)
        {
            String str = DataStore.getHierarchicalChapters()
                    .getSubChapters().get(i).getChapterContent()
                    .toLowerCase();
            Pattern pat = Pattern.compile(searchText.toLowerCase());
            Matcher mat = pat.matcher(str);

            while (mat.find())
            {mat.start()); //
                chapter.add(DataStore.getHierarchicalChapters()
                        .getSubChapters().get(i)); // the
                break;
                // occurrance
            }
            if (DataStore.getHierarchicalChapters().getSubChapters().get(i)
                    .hasSubchapters())
            {
                for (int j = 0; j < DataStore.getHierarchicalChapters()
                        .getSubChapters().get(i).getSubChapters().size(); j++)
                {
                    str = DataStore.getHierarchicalChapters()
                            .getSubChapters().get(i).getSubChapters()
                            .get(j).getChapterContent();
                    mat = pat.matcher(str);
                    while (mat.find())
                    {
                        chapter.add(DataStore.getHierarchicalChapters()
                                .getSubChapters().get(i).getSubChapters()
                                .get(j));
                        break;
                    }
                }
            }

        }
    return chapter;
}

@Override
public int getCount()
{
    return getSearchChapters().size();
}

@Override
public Chapter getItem(int position)
{

    return getSearchChapters().get(position);

}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{

    View row = convertView;

    if (row == null)
    {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        row = inflater.inflate(R.layout.favorite_tab_list_view_row, parent,
                false);
        ViewHolder viewHolder = new ViewHolder();
        viewHolder.chapterName = (TextView) row
                .findViewById(R.id.favoriteChapterTextViewId);

        row.setTag(viewHolder);
    }
    ViewHolder viewHolder = (ViewHolder) row.getTag();

    viewHolder.chapterName.setText(getSearchChapters().get(position)
            .getTitle());

    return row;
}

static class ViewHolder
{
    public TextView chapterName;
}

public static void setSearchText(String searchText)
{
    SearchListAdapter.searchText = searchText;
}
}

我的问题是,如何清除清单?

谢谢。

2 个答案:

答案 0 :(得分:2)

我认为您必须为自定义override clear()方法ArrayAdapter并手动清空适配器所基于的对象列表(并且不要忘记调用{ {1}})。这是默认notifyDataSetChanged()正在做的事情。

编辑:

您的代码现在永远不会正常工作,因为您的自定义适配器从调用方法ArrayAdapter获取其数据时重建适配器的数据每次调用该方法(例如,每次适配器调用getView()时,它都将重建数据)。我的建议是在适配器中创建一个私有字段:

private ArrayList<Chapter> getSearchChapters()

然后在适配器的构造函数中通过调用方法ArrayList<Chapter> data; 来初始化它:

getSearchChapters()

然后您可以覆盖方法data = getSearchChapters();

clear()

此外,您无法从 @Override public void clear() { data.clear(); notifyDataSetChanged(); super.clear(); } 拨打clear,因为您的列表永远不会填充数据(适配器将为空)。我不明白你什么时候想要清除列表,所以我无法告诉你什么时候打电话给onResume()。您可以使用调用adapter.clear()的按钮进行测试,看看是否会清除适配器。

答案 1 :(得分:0)

清除适配器正在使用的ArrayList,然后在Adapter

上调用notifyDataSetChanged()