我正在使用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;
}
}
我的问题是,如何清除清单?
谢谢。
答案 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()