2014-12-06 68 views
0

即使在過濾了listview數據後,我從lisview中單擊項目時也會得到錯誤的結果。我理解當listview被過濾時位置值的變化,我無法弄清楚我如何獲得正確的位置值。任何建議將不勝感激。在Android上點擊lisview項目時,過濾Listview不顯示正確的結果

mListView.setAdapter(mAdapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, data)); 
    mListView.setTextFilterEnabled(true); 
    setupSearchView(); 
    mAdapter.setNotifyOnChange(true); 

    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

      getActivityMain().pushNextFragment(FragmentWebview.newInstance(bbcNewsList.get(position).link,"roundfeed",bbcNewsList.get(position).title,bbcNewsList.get(position).source,bbcNewsList.get(position).image)); 
      System.out.println(" id " + id + " pos " + position); 
     } 
    }); 

我需要使用自定義適配器嗎?

謝謝。

+0

嘗試調用mAdapter.notifyDataSetChanged()後過濾 – 2014-12-06 15:10:11

+0

感謝您的答覆,但沒有奏效。 – n4zg 2014-12-06 15:25:27

回答

0

由於無法將外部列表與適配器的外部列表同步,尤其是在涉及過濾時,無法使用當前的代碼。您需要一個自定義適配器來存儲您的bbcNewsList的數據類型。爲了這個答案,可以說List正在存儲Foo對象。你想要做這樣的事情:

List<Foo> bbcNewsList; 
// Fill bbcNewsList with data 

mAdapter = new MyCustomAdapter(getActivity(),bbcNewsList); 
mListView.setAdapter(mAdapter); 
//Continue instantiation as needed 

你可以嘗試擴大ArrayAdapter爲您定製的解決方案,但可能有問題。首先,您需要覆蓋getView()方法,以便它知道如何顯示自定義Foo對象。否則,它只會將您的Foo對象轉換爲String並顯示該對象。在圖片中進行過濾後,您將陷入默認邏輯。在你的情況下,ArrayAdapter會根據該結果將你的Foo對象轉換爲String並進行過濾。你可能對這種行爲很好,在這種情況下,你用這種方法很好。但是,如果您打算隨時修改它,我會警告ArrayAdapter有一個非常討厭的filtering bug

另一種選擇是從頭編寫自己的適配器。又名執行BaseAdapter類。雖然不太令人生畏,但對於剛剛學習Android的人來說,這可能頗具挑戰性,或者不確定適配器通常如何工作。該解決方案還需要您實施所有過濾代碼。

最後第三個選項是使用第三方庫。我建議AbsArrayAdapter班。你將基本上在這裏做第一個選項,但給你指定如何過濾Foo對象的選項。它也不會受到Android的ArrayAdapter中的過濾錯誤的影響。

+0

非常感謝您提供詳細的答案,非常有用,我會查看ABSArrayAdapter。謝謝 – n4zg 2014-12-06 20:40:24