我有一个BaseAdapter,想要使用filter。它填充了object(1)。我想要使用字段"nome"进行筛选。当我尝试使用过滤器时,它会给我错误。检查代码:
对象包含
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;
}
}
基础适配器
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);
}
});
编辑:
在搜索字段中键入内容后出现错误:
关闭VM
线程退出,出现未捕获的异常(组=0x4001d7d0)
致命异常:主
java.lang.NullPointerException
在com.databrawl.dtliscover.ContatoListAdapter.getCount(ContatoListAdapter.java:28)
在android.widget.AdaperView$AdapterDataSetObserver.onChanged(AdapterView.java:778)
在android.database.DataSetObservable.notifyChanged(DataSetObservable.java:31)
在android.widget.BaseAdapter.notifyDataSetChanged(BaseAdapter.java:50)
在com.databrawl.dtliscover.ContatoListAdapter$1.publishResults(ContatoListAdapter.java:85)
在android.widget.Filter$ResultsHandler.handleMessage(Filter.java:282)
在android.os.Handler.dispatchMessage(Handler.java:99)
在android.os.Looper.loop(Looper.java:123)
在android.app.ActivityThread.main(ActivityThreads.java:4627)
位于java.lang.reflect.Method.invokeNative(Native Method)
位于java.lang.reflect.Method.ioke(Method.java:521)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
网址:com.android.internal.os.ZygoteInit.main(ZygoteNit.java:629)
在dalvik.system.NativeStart.main(本地方法)
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;
}
edit#2:在for循环中,最好使用类似getAllContato()
或类似的东西,而不是lista,因为过滤后,过滤结果会重写变量lista,这意味着每次过滤,列表中的项目会越来越少。。。在这种情况下,你正在过滤过滤的项目等等……我希望你明白我想说的。:)