Comment mettre en œuvre getFilter sur un BaseAdapter?
Je suis en train de mettre en œuvre un getFilter() sur une base de l'adaptateur de filtrer les résultats de recherche sur une Liste. Est-il un exemple de la façon de mettre en œuvre un getFilter()?
MainActivity.java
final AppInfoAdapter adapter = new AppInfoAdapter(this, Utilities.getSystemFilteredApplication(this), getPackageManager());
public void onTextChanged(CharSequence s, int start, int before,
int count) {
adapter.getFilter().filter(s); //Filter from my adapter
adapter.notifyDataSetChanged(); //Update my view
}
AppInfoAdapter.java
package com.example.permission;
import java.util.List;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;
public class AppInfoAdapter extends BaseAdapter implements Filterable{
private Context mContext;
private List mListAppInfo;
PackageManager mPackManager;
public AppInfoAdapter(Context c, List list, PackageManager pm) {
mContext = c;
mListAppInfo = list;
mPackManager = pm;
}
public int getCount() {
return mListAppInfo.size();
}
public Object getItem(int position) {
return mListAppInfo.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
//get the selected entry
ApplicationInfo entry = (ApplicationInfo) mListAppInfo.get(position);
//reference to convertView
View v = convertView;
//inflate new layout if null
if(v == null) {
LayoutInflater inflater = LayoutInflater.from(mContext);
v = inflater.inflate(R.layout.layout_appinfo, null);
}
//load controls from layout resources
ImageView ivAppIcon = (ImageView)v.findViewById(R.id.ivIcon);
TextView tvAppName = (TextView)v.findViewById(R.id.tvName);
TextView tvPkgName = (TextView)v.findViewById(R.id.tvPack);
//set data to display
ivAppIcon.setImageDrawable(entry.loadIcon(mPackManager));
tvAppName.setText(entry.loadLabel(mPackManager));
tvPkgName.setText(entry.packageName);
//return view
return v;
}
public Filter getFilter() {
//TODO Auto-generated method stub
return null;
}
}
EDIT: Modifié le code et ajout de la AppInfoAdapter.java
OriginalL'auteur dythe | 2012-07-23
Vous devez vous connecter pour publier un commentaire.
dans votre adaptateur de mettre cette classe pour l'utiliser dans la méthode getproperty
retour instance dans getfilter
exemple complet
OriginalL'auteur Omar Abdan
cela a failli m'a tué 🙂
définir une liste de tableaux de Liste dans votre public adaptateur classe qui va contenir des éléments temporaires de votre Liste d'Origine.
créer getFilter() la méthode avec le code suivant[à titre d'exemple]:
Et enfin dans votre activité pour votre EditText:
OriginalL'auteur lvle
Vous avez besoin de retourner une instance d'un
Filter
. Pour créer un filtre, sous-classeFilter
et de mettre en œuvreperformFiltering
etpublishResults
. Voir la docs.OriginalL'auteur ᆼᆺᆼ
Vous pouvez poster votre plein
AppInfoAdapter
? Aussi est-il une raison s'étendant à partir deBaseAdapter
et pasArrayAdapter
? Si vous avez unArrayList
d'objets, l'utilisationArrayAdapter
, il implémente déjàFilterable
interface.En fait, vous utilisez un
List
, votre carte peut être réécrite étendArrayAdapter
qui est déjàFilterable
.J'ai édité réponse si votre adaptateur
extends Filterable ArrayAdapter
.Il n'y a pas d'erreurs dans votre code, mais maintenant, je ne vois pas ma liste des applications installées déjà que l'EditText
Remplacer
super(c, 0, new ArrayList<ApplicationInfo>());
avecsuper(c, 0, list);
de Ma faute.Voir
ArrayAdapter
source pour voir commentArrayFilter
fonctionne github.com/android/platform_frameworks_base/blob/master/core/... ou cela peut aider aussi stackoverflow.com/a/4027085/1300995OriginalL'auteur biegleux
Procédure générale
Étape 1:
listview.setTextFilterEnabled(true);
Étape 2:
Étape 3:
}
L'étape 4:
Je ne suis pas sûr de ce type de votre liste, donc en supposant une liste de Chaîne de caractères:
OriginalL'auteur Mtl Dev
getFilter() peut être remplacer les adaptateurs et le retour de l'objet filtre qui contient la liste filtrée . Il existe deux principales méthodes de filtrage() de la classe; performFiltering et publishResults. La première méthode effectue le filtrage dans le thread de travail et plus tard celle de retour filtré la liste des objets.
Vous pouvez voir l'exemple de code ci-dessous
Espère que vous le trouverez utile .
OriginalL'auteur Sanny Singhs
étendre votre classe avec ArrayAdapter,puis remplacer les méthodes,et de créer un objet de la classe de filtre et de le retourner avec elle.
OriginalL'auteur