2016-11-30 1 views
0

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).

enter image description here

Dans cet écran, je l'ai recherché de cam il me montre un résultat correct.

enter image description here

J'ai clair jusqu'à ce que c et je me attends resut devrait être deux élément à savoir caméra et LED TV.

enter image description here

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.

+0

utilisez [this] (https://gist.github.com/pskink/2dd4d17a93caf02ff696533e82f952b0) adaptateur générique – pskink

Répondre

1

C'est parce que vous modifiez la itemRateList

Cocher cette méthode:

@Override 
protected void publishResults(CharSequence charSequence, FilterResults results) { 
    itemRateList=(ArrayList<RateList>) results.values; 
    notifyDataSetChanged(); 
} 

Je vous suggère de stocker le résultat dans une arrayList séparée et de l'utiliser pour vous dans la classe adaptateur.

En raison de la mise à jour du résultat ci-dessus dans l'original itemRateList, la prochaine fois que la méthode performFiltering est appelée. Vous itérez juste le résultat précédent et PAS la liste originale.

Espérons que cela aide.

+0

désolé, mais je n'ai pas encore effacé les modifications que je dois faire. –

+0

merci cela fonctionne. –