2011-09-03 47 views
0

我正在使用過濾器構建分段列表,其中,當我過濾時,即使段落爲空,段落標題仍保留在結果中。 我基於我在this link上的分段列表代碼,它完美地工作(在頁面末尾有一個eclipse項目的下載),我從這個代碼複製佈局文件和getView()函數,當我運行代碼,沒關係,當我用空搜索過濾時,它也可以正常工作,但是當我嘗試使用實際更改列表的任何內容進行過濾時,出現錯誤並且程序關閉。 我的代碼如下:獲取錯誤嘗試使用過濾器執行自定義數組列表

public class ListaCustom extends ArrayAdapter<Item> implements Filterable{ 
    private List<Item> items; 
    private Filter filter= null; 
    private final Object mLock = new Object(); 
    private ArrayList<Item> mOriginalValues; 
    private LayoutInflater vi; 
    private int mFieldId = 0; 

    public ListaCustom(Context context, int textViewResourceId, ArrayList<Item> objects) { 
     super(context, textViewResourceId, objects); 
     items = objects; 

     vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public void addItemNormal(String nome){ 
     items.add(new ItemNormal(nome)); 
    }; 
    public void addSecao(String nome){ 
     items.add(new Secao(nome)); 
    }; 
    public Item get(int pos){ 
     return items.get(pos); 
    }; 
    public int size(){ 
     return items.size(); 
    }; 

    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 

     final Item i = items.get(position); 
      if(i.isSection()){ 
       Secao si = (Secao)i; 
       v = vi.inflate(R.layout.list_item_section, null); 

       v.setOnClickListener(null); 
       v.setOnLongClickListener(null); 
       v.setLongClickable(false); 

       final TextView sectionView = (TextView) v.findViewById(R.id.list_item_section_text); 
       sectionView.setText(si.getNome()); 
      }else{ 
       ItemNormal ei = (ItemNormal)i; 
       v = vi.inflate(R.layout.list_item_entry, null); 
       final TextView title = (TextView)v.findViewById(R.id.list_item_entry_title); 

       if (title != null) 
        title.setText(ei.getNome()); 
      } 
     return v; 
    } 



    @Override 
    public Filter getFilter() 
    { 
     if(filter == null) 
      filter = new myFilter(); 
     return filter; 
    } 

    private class myFilter extends Filter{ 

     @Override 
     protected FilterResults performFiltering(CharSequence prefix) { 
      FilterResults results = new FilterResults(); 

      if (mOriginalValues == null) { 
       synchronized (mLock) { 
        mOriginalValues = new ArrayList<Item>(items); 
       } 
      } 

      if (prefix == null || prefix.length() == 0) { 
       synchronized (mLock) { 
        ArrayList<Item> list = new ArrayList<Item>(mOriginalValues); 
        results.values = list; 
        results.count = list.size(); 
       } 
      } else { 
       String prefixString = prefix.toString().toLowerCase(); 

       final ArrayList<Item> values = mOriginalValues; 
       final int count = values.size(); 
       final ArrayList<Item> newValues = new ArrayList<Item>(count); 

       for (int i = 0; i < count; i++) { 
        final Item value = values.get(i); 
        final String valueText = value.getNome().toLowerCase(); 

        // First match against the whole, non-splitted value 
        if (value.isSection()) { 
         newValues.add(value); 
        } 
        else { 
         if (valueText.contains(prefixString)) { 
          newValues.add(value); 
         } 
        } 

       } 

       results.values = newValues; 
       results.count = newValues.size(); 
      } 

      return results; 
     } 

     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      //noinspection unchecked 
      Log.v("count", results.count+""); 
      items = (List<Item>) results.values; 
      if (results.count > 0) { 
       notifyDataSetChanged(); 
      } else { 
       notifyDataSetInvalidated(); 
      } 
     } 

    } 

} 

因爲我從巴西來了,還有一些葡萄牙語的方法和變量,因此,只是有點幫助: 項目 - 抽象類 ItemNormal - 擴展項目,是一個普通的項目 secao - 延伸項目,是一個部分項目 getNome() - 返回項目文本

我不知道這是什麼問題,我開始認爲有什麼關係, getView,但我真的不確定。

我已經將我的項目上傳到this link,如果我設法解決問題,我會更新它。

謝謝。

回答

0

該死的,我重寫了getCount方法,它工作。
我在論壇閱讀,他們給了這個建議,但我仍然不明白這種方法何時被調用。如果有人能回答我,我至少會從中學到一些東西。 感謝反正

這裏是link to the working code

相關問題