J'ai personnalisé listview et j'ai mis en œuvre SearchView pour filtrer les données. Lorsque nous tapons quelque chose pour la liste de recherche, nous obtenons un filtre correctement, mais lorsque j'efface certains caractères du texte de recherche, listview ne filtre pas les données. Il reste constant à la dernière position de recherche.Android: Filtrage ne fonctionne pas sur le texte clair
Laissez-moi vous expliquer avec des captures d'écran.
Ici, la liste n'est pas encore filtrée. tous les articles sont présents. Je recherche dans deux champs de chaque article (nom et description).
Dans cet écran, je l'ai recherché de cam
il me montre un résultat correct.
J'ai clair jusqu'à ce que c et je me attends resut devrait être deux élément à savoir caméra et LED TV.
Voici mon code.
RateListAdapter.java
public class RateListAdapter extends BaseAdapter implements Filterable {
Context context;
private SparseBooleanArray mSelectedItemsIds;
public ArrayList<RateList> itemRateList;
public LayoutInflater inflater = null;
public ArrayList<RateList> tempList;
CustomFilter filter;
public RateListAdapter(Context context, ArrayList<RateList> itemRateList) {
this.context = context;
this.itemRateList = itemRateList;
mSelectedItemsIds = new SparseBooleanArray();
this.tempList = itemRateList;
}
@Override
public int getCount() {
return itemRateList.size();
}
@Override
public RateList getItem(int i) {
return itemRateList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
class Holder {
TextView tv_name, tv_description, tv_amount;
ImageView iv_itemImage;
}
@Override
public View getView(int i, View convertView, ViewGroup viewGroup) {
Holder h = new Holder();
RateList rateList = itemRateList.get(i);
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = inflater.inflate(R.layout.rate_list_item, viewGroup, false);
}
h.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
h.tv_description = (TextView) convertView.findViewById(R.id.tv_description);
h.tv_amount = (TextView) convertView.findViewById(R.id.tv_amount);
h.iv_itemImage = (ImageView) convertView.findViewById(R.id.iv_itemImage);
h.tv_name.setText(rateList.Name);
h.tv_description.setText(rateList.description);
h.tv_amount.setText("₹ "+rateList.amount);
Picasso.with(context).load(rateList.image).resize(92,92).into(h.iv_itemImage);
return convertView;
}
public void toggleSelection(int position) {
selectView(position, !mSelectedItemsIds.get(position));
}
public void selectView(int position, boolean value) {
if (value)
mSelectedItemsIds.put(position, value);
else
mSelectedItemsIds.delete(position);
notifyDataSetChanged();
}
public SparseBooleanArray getSelectedIds() {
return mSelectedItemsIds;
}
public void removeSelection() {
mSelectedItemsIds = new SparseBooleanArray();
notifyDataSetChanged();
}
@Override
public Filter getFilter() {
if(filter == null)
{
filter=new CustomFilter();
}
return filter;
}
private class CustomFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results=new FilterResults();
if(constraint != null && constraint.length()>0) {
constraint=constraint.toString().toLowerCase();
ArrayList<RateList> filters=new ArrayList<RateList>();
for(int i=0;i<itemRateList.size();i++) {
if (itemRateList.get(i).Name.toLowerCase().contains(constraint) ||
itemRateList.get(i).description.toLowerCase().contains(constraint)) {
RateList r = new RateList();
r.Name = itemRateList.get(i).Name;
r.description= itemRateList.get(i).description;
r.id = itemRateList.get(i).id;
r.image = itemRateList.get(i).image;
r.amount = itemRateList.get(i).amount;
filters.add(r);
}
}
results.count = filters.size();
results.values = filters;
} else {
results.count=itemRateList.size();
results.values=itemRateList;
}
return results;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults results) {
itemRateList=(ArrayList<RateList>) results.values;
notifyDataSetChanged();
}
}
}
Code SearchView de
BookingFrament.java
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return true;
}
@Override
public boolean onQueryTextChange(String searchQuery) {
rateListAdapter.getFilter().filter(searchQuery);
return false;
}
});
S'il vous plaît aider.
utilisez [this] (https://gist.github.com/pskink/2dd4d17a93caf02ff696533e82f952b0) adaptateur générique – pskink