2011-08-09 1 views
3

Le code suivant renvoie 0 vues dans listview à l'entrée d'un caractère dans la recherche EditText. suivant la méthode est de classe activtyFiltrage à l'aide de TextWatcher sur une ListView soutenue par une chaîne ArrayAdapter renvoie des résultats vides

private void setupList() { 
    final ListView lv = (ListView) findViewById(R.id.contactList); 
    ArrayAdapter<Info> la = new MyListAdapter(this, mInfoList); 
    lv.setAdapter(la); 
    lv.setTextFilterEnabled(true); 
    EditText edit = (EditText) findViewById(R.id.searchbar); 
    edit.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 

     } 

     @Override 
     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
       int arg3) { 

     } 

     @Override 
     public void afterTextChanged(Editable text) { 
      Log.d("search", ""+text); 
      ArrayAdapter<Info> la = (ArrayAdapter<Info>) lv.getAdapter(); 
      la.getFilter().filter(text); 
      la.notifyDataSetChanged(); 
     } 
    }); 
} 

Ceci est ma classe d'adaptateur

public class MyListAdapter extends ArrayAdapter<Info> { 
private Bitmap mDefaultProfilePic = null; 
Context mContext = null; 

public MyListAdapter(Context ctxt, ArrayList<Info> mFriendsAccounts) { 
    super(ctxt, R.id.name, mFriendsAccounts); 
    mContext = ctxt; 

    mDefaultProfilePic = BitmapFactory.decodeResource(ctxt.getResources(), R.drawable.face); 
} 


@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    if (convertView == null) { 
     LayoutInflater inf = (LayoutInflater) mContext.getSystemService(Service.LAYOUT_INFLATER_SERVICE); 
     convertView = inf.inflate(R.layout.layout_list_view, null); 
    } 
    Info usr = getItem(position); 
    ((TextView)convertView.findViewById(R.id.name)).setText(usr.Name); 
    ((ImageView)convertView.findViewById(R.id.invite)).setTag(position); 

    if (mImageBitmaps.get(position) != null) { 
     ((ImageView)convertView.findViewById(R.id.profilePic)).setImageBitmap(mImageBitmaps.get(position)); 
    } else { 
     ((ImageView)convertView.findViewById(R.id.profilePic)).setImageBitmap(mDefaultProfilePic); 
    } 

    return convertView; 
} 

} 
+0

Avez-vous débogué et parcouru le code pour voir exactement ce que renvoie getAdapter? – Jack

Répondre

4

Enfin résolu le problème. J'ai dû remplacer la méthode toString() dans l'objet Info. Dans mon cas, le filtrage est basé sur le champ name, donc retourné par toString().
Le processus de filtrage appelle le toString() sur chaque objet de l'adaptateur.

+0

userSeven7s j'ai le même problème mais je ne peux pas montrer le problème. Pourriez-vous être un peu explicite. Thx – Lasecun

+0

avez-vous posté une question ici? S'il vous plaît donner le lien. Dans mon cas, j'ai remplacé la méthode 'toString' pour retourner les données de l'objet info sous forme de chaîne. – Ronnie

+0

Ici - http://stackoverflow.com/questions/12476645/filter-listview-i-cant-understand-filter-rule – Lasecun

1

Here il dit:

L'adaptateur retourné pourrait ne pas être le même adaptateur est passé à setAdapter (ListAdapter) mais peut être un WrapperListAdapter

Est-ce que cela pourrait avoir quelque chose à voir avec votre problème?

+0

Non. J'ai ajouté un membre pour tenir l'adaptateur mais je n'ai pas résolu le problème. – Ronnie

+0

Avez-vous débugué et parcouru le code pour voir exactement ce qui se passe? – Jack

+0

Oui. le listview obtient toutes les vues (au lieu de seulement les vues filtrées) de l'adapteur quand j'appuie sur n'importe quelle clef .. mais il ne les montre pas dans le listview. cela signifie-t-il que le filtre est le problème? – Ronnie

Questions connexes