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)
,210com.android.internal.os.ZygoteInit.main에서 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:871)
에서 (ZygoteInit.java:629)
dalvik.system.NativeStart에서주 (기본 방법)
질문에 오류가 추가되면 정말 유용 할 것입니다. – zapl
참고로 Contato 클래스에 get/set 메서드가 필요하지 않습니다. 각 멤버가'public'이므로'String name = contato1.name'과'contato1.name = "George"'로 직접 액세스 할 수 있습니다. – Sam