2012-02-18 54 views
2

我使用ListView來顯示搜索結果。我有一個Coustomized arrayListAdapter,它返回一個對象列表。這工作正常。我的listView只顯示一個TextView沒有別的。自定義ArrayListAdapter.clear()不起作用

但是我想再次進入搜索頁面時清除列表。我曾嘗試

@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

後一些更多的代碼.. – 2012-02-18 12:25:43

回答

2

我認爲你必須override方法clear()爲您定製ArrayAdapter和手動清空上您的適配器是基於(不要忘記調用notifyDataSetChanged())對象的列表。這是默認的ArrayAdapter正在做的事情。

編輯:

,因爲您的自定義適配器從調用該方法獲取數據,您的代碼將永遠不會現在的工作private ArrayList<Chapter> getSearchChapters()每次它重建適配器的每次該方法被稱爲數據(例如該適配器調用getView()它將重建數據)。我的建議是讓你的適配器私有字段:

ArrayList<Chapter> data; 

,然後在您的適配器的構造函數通過調用方法getSearchChapters()初始化:

data = getSearchChapters(); 

然後你就可以覆蓋的方法clear()

@Override 
    public void clear() { 
     data.clear(); 
     notifyDataSetChanged(); 
     super.clear(); 
    } 

此外,您不能從onResume()撥打電話clear,因爲您的清單永遠不會收到寶用數據調節(適配器將是空的)。我不明白你什麼時候想清除名單,所以我不能告訴你什麼時候打電話給adapter.clear()。您可以使用調用clear()的按鈕進行測試,看看是否清除適配器。

+0

不工作。 :( – asish 2012-02-18 12:37:48

+0

@ashish我編輯了我的答案 – Luksprog 2012-02-18 15:58:54

+0

謝謝你的建議。我明白了:)只需在onResume中將searchText設置爲null即可。 – asish 2012-02-19 09:15:28

0

清除ArrayList的適配器使用然後適配器調用notifyDataSetChanged()