Android 使用自定义阵列适配器和筛选器时没有结果
我有一个自定义的Android 使用自定义阵列适配器和筛选器时没有结果,android,filtering,android-arrayadapter,Android,Filtering,Android Arrayadapter,我有一个自定义的ArrayAdapter类似于以下代码: public class UtenteAdapter extends ArrayAdapter<Utente> implements Filterable { private Context context; private ArrayList<Utente> utenti; private ArrayList<Utente> utentiFiltrati; private FiltroPersonal
ArrayAdapter
类似于以下代码:
public class UtenteAdapter extends ArrayAdapter<Utente> implements Filterable {
private Context context;
private ArrayList<Utente> utenti;
private ArrayList<Utente> utentiFiltrati;
private FiltroPersonalizzato filtro;
public UtenteAdapter(Context context, ArrayList<Utente> utenti) {
super(context, R.layout.riga_utente, utenti);
this.context=context;
this.utenti=utenti;
utentiFiltrati = new ArrayList<Utente>();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
//omitted..
return riga;
}
@Override
public void notifyDataSetChanged(){
super.notifyDataSetChanged();
}
@Override
public Filter getFilter() {
if (filtro == null) {
filtro = new FiltroPersonalizzato();
}
return filtro;
}
private class FiltroPersonalizzato extends Filter {
@Override
protected FilterResults performFiltering(CharSequence prefix) {
FilterResults risultato = new FilterResults();
ArrayList<Utente> i = new ArrayList<Utente>();
if (prefix!= null && prefix.toString().length() > 0) {
// use the initial values !!!
for (int index = 0; index < utenti.size(); index++) {
Utente si = utenti.get(index);
final int length = prefix.length();
// if you compare the Strings like you did it will never work as you compare the full item string(you'll have a match only when you write the EXACT word)
// keep in mind that you take in consideration capital letters!
if(si.getNome().toLowerCase().substring(0, length).compareTo(prefix.toString().toLowerCase()) == 0){
i.add(si);
}
}
risultato.values = i;
risultato.count = i.size();
}
else{
// revert to the old values
synchronized (utentiFiltrati){
risultato.values = utenti;
risultato.count = utenti.size();
}
}
return risultato;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
utentiFiltrati = (ArrayList<Utente>)results.values;
notifyDataSetChanged();
}
}
}
我从ListFragment
更新我的ArrayAdapter
,如下所示:
private void setListaUtenti(){
if(getListAdapter()==null){
// creo l'adapter
adapter=new UtenteAdapter(
getActivity(),
utenti);
setListAdapter(adapter);
} else{
adapter.notifyDataSetChanged();
}
}
为什么我看不到过滤操作的结果
我有一个searchview,我想按名称筛选行,但我没有
结果
在Filter
的publishResults()
回调中将结果分配给utifiltrati
列表并调用notifyDataSetChanged()
,这是很正常的。这不会起任何作用,因为适配器基于uti
列表,即传递给超级类构造函数的列表。进行以下更改:
public UtenteAdapter(Context context, ArrayList<Utente> utentiValues) {
super(context, R.layout.riga_utente, utentiValues);
this.context=context;
this.utentiFiltrati = utentiValues;
utenti = new ArrayList<Utente>(utentiValues);
}
// ...
FilterResults risultato = new FilterResults();
ArrayList<Utente> i;
if (prefix == null || prefix.toString().length() == 0) {
// the contract of a Filter says that you must return all values if the
// challenge string is null or 0 length
i = new ArrayList<Utente>(utenti);
} else {
i = new ArrayList<Utente>();
// use the list that contains the full set of data
for (int index = 0; index < utenti.size(); index++) {
Utente si = utenti.get(index);
final int length = prefix.length();
if(si.getNome().toLowerCase().substring(0, length).compareTo(prefix.toString().toLowerCase()) == 0){
i.add(si);
}
}
//...
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
utentiFiltrati = (ArrayList<Utente>)results.values;
notifyDataSetChanged();
}
public-uteAdapter(上下文、ArrayList-uteValue){
super(上下文,R.layout.riga_-utete,utivivalues);
this.context=context;
this.utifiltrati=utivivalues;
utenti=新的ArrayList(utentiValues);
}
// ...
FilterResults risultato=新的FilterResults();
ArrayList i;
if(prefix==null | | prefix.toString().length()==0){
//过滤器的契约规定,如果
//质询字符串为null或长度为0
i=新阵列列表(Uteni);
}否则{
i=新的ArrayList();
//使用包含完整数据集的列表
对于(int index=0;index
当您输入一些过滤文本时,您看不到过滤的值(或任何更改)?我可以进入onQueryTextSubmit,但没有过滤的元素..我没有尝试任何更改:adapter.getFilter().filter(query);SetListAuthenti();但我还没有结果..@fabio如果您执行clear();UntiFiltrati=(ArrayList)results.values;如何(Utente item:utentiFiltrati){add(item);}
在publishResults()
方法中?是的,现在我有了一个结果!(但它是错误的…)我如何在搜索之前返回?@fabio这到底是什么意思,但它是错误的?在搜索之前返回-您是否试图显示未过滤的列表(在这种情况下,您可以使用null
字符串再次筛选列表)?我解决了我的问题(在getview上,我必须使用数组筛选),谢谢Luksprog!
public UtenteAdapter(Context context, ArrayList<Utente> utentiValues) {
super(context, R.layout.riga_utente, utentiValues);
this.context=context;
this.utentiFiltrati = utentiValues;
utenti = new ArrayList<Utente>(utentiValues);
}
// ...
FilterResults risultato = new FilterResults();
ArrayList<Utente> i;
if (prefix == null || prefix.toString().length() == 0) {
// the contract of a Filter says that you must return all values if the
// challenge string is null or 0 length
i = new ArrayList<Utente>(utenti);
} else {
i = new ArrayList<Utente>();
// use the list that contains the full set of data
for (int index = 0; index < utenti.size(); index++) {
Utente si = utenti.get(index);
final int length = prefix.length();
if(si.getNome().toLowerCase().substring(0, length).compareTo(prefix.toString().toLowerCase()) == 0){
i.add(si);
}
}
//...
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
utentiFiltrati = (ArrayList<Utente>)results.values;
notifyDataSetChanged();
}