2012-08-27 2 views
0

BaseAdapter가 있는데 필터를 사용하고 싶습니다. 그것의 개체 (1)으로 채워집니다. "nome"필드를 사용하여 필터를 원합니다. 필터를 사용하려고하면 오류가 발생합니다. 코드 확인 :사용자 정의 BaseAdapter 필터가 작동하지 않습니다.

객체 baseadapter

public class Contato { 
    public static final String CONTATO_NOME = "contato_nome"; 
    public static final String CONTATO_ORG = "contato_org"; 
    public static final String CONTATO_ID = "contato_id"; 

    public static String[] colunas = {"_id", Contato.CONTATO_NOME, Contato.CONTATO_ORG, Contato.CONTATO_ID}; 

    public long _id; 
    public String nome; 
    public String org; 
    public String id; 

    public Contato() { 
    } 

    public Contato (String nome, String org, String id) { 
     this.nome = nome; 
     this.org = org; 
     this.id = id; 
    } 

    public Contato (long _id, String nome, String org, String id) { 
     this.id = id; 
     this.nome = nome; 
     this.org = org; 
     this.id = id; 
    } 

    public static String[] getColunas() { 
     return colunas; 
    } 
    public static void setColunas(String[] colunas) { 
     Contato.colunas = colunas; 
    } 

    public long get_Id() { 
     return _id; 
    } 
    public void set_Id(long _id) { 
     this._id = _id; 
    } 

    public String getNome() { 
     return nome; 
    } 
    public void setNome(String nome) { 
     this.nome = nome; 
    } 

    public String getOrg() { 
     return org; 
    } 
    public void setOrg(String org) { 
     this.org = org; 
    } 

    public String getId() { 
     return id; 
    } 
    public void setId(String id) { 
     this.id = id; 
    } 
} 

Contato을

public class ContatoListAdapter extends BaseAdapter implements Filterable { 
    private Context context; 
    private List<Contato> lista; 
    private TextView nome; 
    private TextView org; 
    private LayoutInflater inflater; 

    public ContatoListAdapter(Context contexto, List<Contato> lista) { 
     this.context = contexto; 
     this.lista = lista; 
    } 

    public int getCount() { 
     return lista.size(); 
    } 

    public Object getItem(int position) { 
     return lista.get(position); 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     // Recupera a atividade da posição atual 
     Contato c = lista.get(position); 

     if (position == 0) { 

      inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      View view = inflater.inflate(R.layout.contato_linha_lista, null); 
      // Atualiza o valor do TextView 
      nome = (TextView) view.findViewById(R.id.txtContatoListaNome); 
      nome.setText(c.nome); 

      org = (TextView) view.findViewById(R.id.txtContatoListaOrganizacao); 
      org.setText(c.org); 

      return view; 

     } else { 

      inflater = (LayoutInflater) context 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      View view = inflater.inflate(R.layout.contato_linha_lista, null); 

      // Atualiza o valor do TextView 
      nome = (TextView) view.findViewById(R.id.txtContatoListaNome); 
      nome.setText(c.nome); 

      org = (TextView) view.findViewById(R.id.txtContatoListaOrganizacao); 
      org.setText(c.org); 

      return view; 

     } 
    } 

    public Filter getFilter() { 
     return new Filter() { 

      @SuppressWarnings("unchecked") 
      @Override 
      protected void publishResults(CharSequence constraint, 
        FilterResults results) { 
       lista = (List<Contato>) results.values; 
       ContatoListAdapter.this.notifyDataSetChanged(); 
      } 

      @Override 
      protected FilterResults performFiltering(CharSequence constraint) { 

       List<Contato> filteredResults = getFilteredResults(constraint); 

       FilterResults results = new FilterResults(); 

       results.values = filteredResults; 

       return results; 
      } 
     }; 
    } 

    protected List<Contato> getFilteredResults(CharSequence constraint) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

필터의 전화

Util.etxtTelaContatosListaBuscar 
       .addTextChangedListener(new TextWatcher() { 
        public void afterTextChanged(Editable s) { 
        } 

        public void beforeTextChanged(CharSequence s, int start, 
          int count, int after) { 
        } 

        public void onTextChanged(CharSequence s, int start, 
          int before, int count) { 
         if (Util.adapter != null) 
          Util.adapter.getFilter().filter(s); 
        } 
       }); 

편집 : 공학자에 입력 뭔가 후 내가 가진

오류 H 필드 :

는 캐치되지 않는 예외 (그룹 = 0x4001d7d0)

FATAL 제외 종료 VM

스레드 종료 : 에서 메인

java.lang.NullPointerException이

COM .datalabrasil.dtldiscover.ContatoListAdapter.getCount (ContatoListAdapter.java:28)

android.widget에서 android.database.DataSetObservable.notifyChanged (DataSetObservable.java:31)

에서 android.widget.AdapterView $ AdapterDataSetObserver.onChanged (AdapterView.java:778)

에서

. com.datalabrasil.dtldiscover.ContatoListAdapter $ 1.publishResults (ContatoListAdapter.java:85)

에서 (BaseAdapter.java:50)

에서 BaseAdapter.notifyDataSetChanged 및 android.os.Looper.loop에서 android.os.Handler.dispatchMessage (Handler.java:99)

에서

roid.widget.Filter $ ResultsHandler.handleMessage (Filter.java:282) (자벌레. 자바 : 123) android.app.ActivityThread.main (ActivityThread.java:4627에서

) java.lang.reflect.Method.invokeNative (기본 방법에

) java.lang의에서

. reflect.Method.invoke (Method.java:521)

,210

com.android.internal.os.ZygoteInit.main에서 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:871)

에서 (ZygoteInit.java:629)

dalvik.system.NativeStart에서

주 (기본 방법)

+1

질문에 오류가 추가되면 정말 유용 할 것입니다. – zapl

+0

참고로 Contato 클래스에 get/set 메서드가 필요하지 않습니다. 각 멤버가'public'이므로'String name = contato1.name'과'contato1.name = "George"'로 직접 액세스 할 수 있습니다. – Sam

답변

1
protected List<Contato> getFilteredResults(CharSequence constraint) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

난 당신이 올바른 결과 :

편집을 반환,이 방법의 몸을 채우기 위해 생각 :이 시도 :

protected List<Contato> getFilteredResults(CharSequence constraint) { 
    ArrayList<Contacto> filteredList = new ArrayList<Contato>(); 
    for (Contato c:lista) { 
     if (c.nome.trim().toLowerCase().startsWith(constraint.toString().trim().toLowerCase())) { // you can also use contains instead of startsWith...whatever you need 
      filteredList.add(c); 
     } 
    } 
    return filteredList; 
    } 

편집 #을 2 : for the cycle은 아마도 getAllContato() 같은 것을 사용하는 것이 더 좋을 것입니다. 예를 들어, lista 대신 filter, f 필터링 된 결과는 변수 lista를 다시 작성하므로 모든 필터링을 수행하면 목록에있는 항목이 줄어들어 ... 필터링 된 항목을 필터링하는 경우 등등 ... 내가 말하고자하는 바를 얻을 수 있기를 바랍니다. . :)

+0

음,이 필터 뒤에있는 논리를 잘 이해하지 못 했으므로이 방법을 어떻게 사용하는지 알지 못합니다. – Yory

+0

다음과 같이 시도하십시오 :'ArrayList filteredList = new ArrayList (); (: 중고 장비 구매 Contato C) { \t 당신은 또한 ... c.nome.contains을 사용할 수 있습니다 * (c.nome.startsWith가 (제약)) {/ 당신이 필요로하는 어떤 경우 */ \t \t filteredList.add (C에 대한 ); \t} } return filteredList; –

+0

** 편집 ** ** 자세한 내용은 내 대답은 –

관련 문제