Hé les gars mon premier poste ici ... J'essaie d'écrire un filtre personnalisé pour filtrer l'arraylist dans mon arrayadapter de telle sorte que ma listview est filtrée quand je clique sur le bouton.Android Comment remplacer le filtre de mon ArrayAdapter?
Par exemple, lorsque je clique sur mon bouton
public void onClick(View arg0) {
String abc = "abc";
m_adapter.getFilter().filter(abc);
}
Cependant, lorsque je clique sur mon bouton, mon application de manière inattendue. Voici mon code pour l'arrayadapter et le filtre. Aidez-moi, s'il vous plaît.
package com.ntu.rosemobile.searchlist;
public class ResultsAdapter extends ArrayAdapter<SearchItem> implements Filterable{
public ArrayList<SearchItem> subItems;
public ArrayList<SearchItem> allItems;
private LayoutInflater inflater;
private PTypeFilter filter;
public ResultsAdapter(Context context, int textViewResourceId, ArrayList<SearchItem> items) {
super(context, textViewResourceId, items);
this.subItems = items;
this.allItems = this.subItems;
inflater= LayoutInflater.from(context);
}
@Override
public Filter getFilter() {
if (filter == null){
filter = new PTypeFilter();
}
return filter;
}
//@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
v = inflater.inflate(R.layout.listrow, null);
}
SearchItem o = subItems.get(position);
if (o != null) {
TextView pname = (TextView) v.findViewById(R.id.productname);
TextView neg = (TextView) v.findViewById(R.id.negNum);
TextView pos = (TextView) v.findViewById(R.id.posNum);
TextView neu = (TextView) v.findViewById(R.id.neuNum);
WebImageView productPhoto = (WebImageView)v.findViewById(R.id.pPhoto);
if(productPhoto!=null){
productPhoto.setImageUrl(o.getImageUrl().toString());
productPhoto.loadImage();
}
if(pname!= null){
pname.setText(o.getProductName().toString());
}
if (neg != null) {
String a = "" + o.getNegativeReviews();
neg.setText(a);
}
if(neu != null){
String a = "" + o.getNeutralReviews();
neu.setText(a);
}
if(pos != null){
String a = "" + o.getPositiveReviews();
pos.setText(a);
}
}
return v;
}
private class PTypeFilter extends Filter{
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence prefix,
FilterResults results) {
// NOTE: this function is *always* called from the UI thread.
subItems = (ArrayList<SearchItem>)results.values;
notifyDataSetChanged();
}
@SuppressWarnings("unchecked")
protected FilterResults performFiltering(CharSequence prefix) {
// NOTE: this function is *always* called from a background thread, and
// not the UI thread.
FilterResults results = new FilterResults();
ArrayList<SearchItem> i = new ArrayList<SearchItem>();
if (prefix!= null && prefix.toString().length() > 0) {
for (int index = 0; index < allItems.size(); index++) {
SearchItem si = allItems.get(index);
if(si.getPType().compareTo(prefix.toString()) == 0){
i.add(si);
}
}
results.values = i;
results.count = i.size();
}
else{
synchronized (allItems){
results.values = allItems;
results.count = allItems.size();
}
}
return results;
}
}
}
Vous pourriez vouloir utiliser 'LogCat' et laisser des instructions de débogage à l'intérieur de votre code. "LogCat" est le meilleur pour comprendre pourquoi l'application s'est écrasée de manière inattendue, il vous dira où et pourquoi. –
Comme Anthony a dit, s'il vous plaît donner la trace de la pile. –
salut anthony merci pour la réponse rapide .. theres semble être un index hors de l'exception liée pour mon arraylist ... causé par le .get de l'adaptateur ... y at-il une fonction que j'ai oublié d'écraser? – alan