2017-05-11 1 views
0

Je veux définir le filtre (recherche) dans la vue liste et utiliser "extends BaseAdapter implements Filterable" pour la classe de l'adaptateur.adaptateur de base personnalisé ne fonctionne pas filtre

ce mon code:

public class UserList extends BaseAdapter implements Filterable { 
    private Context context; 
    private List<Users> user; 

    public UserList(Context context, List<Users> user) { 
     this.context = context; 
     this.user = user; 
    } 

    @Override 
    public int getCount() { 
     return user.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return user.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return user.get(position).getId(); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = View.inflate(context, R.layout.listview_item, null); 
     ImageView imgUser = (ImageView) view.findViewById(R.id.list_image); 
     TextView txtName = (TextView) view.findViewById(R.id.list_item_title); 
     TextView txtDesc = (TextView) view.findViewById(R.id.list_item_short); 
     TextView txtSex = (TextView) view.findViewById(R.id.list_item_sex); 
     TextView txtAge = (TextView) view.findViewById(R.id.list_item_age); 
     //get byte[] from db , resize and convert to bitmap 
     Bitmap bmp = BitmapFactory.decodeByteArray(user.get(position).getPic(), 0, user.get(position).getPic().length); 
     imgUser.setImageBitmap(getResizedBitmap(bmp, 300, 150)); 
     txtName.setText(user.get(position).getUserName()); 
     txtDesc.setText(user.get(position).getUserDesc()); 
     txtSex.setText(user.get(position).getGender()); 
     txtAge.setText(user.get(position).getAge() + " ساله "); 
     return view; 
    } 

et cette ma méthode de filtre:

private Filter filterResult = new Filter() { 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults filterResults = new FilterResults(); 
      ArrayList<Users> tempList = new ArrayList<>(); 
      if (constraint != null && user != null) { 
       int length = user.size(); 
       int i = 0; 
       while (i < length) { 
        Users item = user.get(i); 
        tempList.add(item); 
        i++; 
       } 
       filterResults.values = tempList; 
       filterResults.count = tempList.size(); 
      } 
      return filterResults; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      user = (ArrayList<Users>) results.values; 
      if (results.count > 0) { 
       notifyDataSetChanged(); 
      } else { 
       notifyDataSetInvalidated(); 
      } 
     } 
    }; 

    @Override 
    public Filter getFilter() { 
     return filterResult; 
    } 

mais pas se produire lorsque saisir du texte pour une vue liste de filtres ... voir cette image: enter image description here

+0

user = (ArrayList ) results.values; problème est ici vous changer la référence – Pavan

+0

je ne sais pas quoi faire!? –

Répondre

1

Il y a quelques erreurs dans votre code.

  1. Vous devez conserver le tableau d'origine qui n'avait pas de filtre. Vous devez changer votre code comme celui-ci

    private List<Users> original; 
    private List<Users> user; 
    public UserList(Context context, List<Users> user) { 
        this.context = context; 
        this.user = user; 
        this.original = user; 
    } 
    
  2. Vous n'avez pas effectué filtre dans votre code. Vous devez corriger votre code

    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 
        FilterResults filterResults = new FilterResults(); 
        ArrayList<Users> tempList = new ArrayList<>(); 
        if (original != null) { 
         if (TextUtil.isEmpty(constraint)){ 
          tempList = original; 
         } else { 
          int length = user.size(); 
          int i = 0; 
          while (i < length) { 
           User item = original.get(i); 
           // check item again your constraint see example below 
           if (item.name.contain(constraint)) 
            tempList.add(item); 
           i++; 
          } 
         } 
        } 
        filterResults.values = tempList; 
        filterResults.count = tempList.size(); 
        return filterResults; 
    } 
    
1

dans ce cas, votre référence de jeu de données est en train de changer le filtre pour adaptateur ne peut pas faire référence à vos données par ma solution je vais le faire suivre

déclarer la liste temp adaptateur qui contiennent toutes les données

private List<Users> tempuser; 

remplir maintenant cela avec boucle pour éviter tout problème de référence et l'appeler dans le constructeur de l'adaptateur

private void fillData() 
    { 
    // initialize tempuserhere 
tempuser=new List<Users>() ; //check as per your model 
     for(Users obj:user) 
     { 
      tempuser.add(obj); 
     } 

    } 

dans le constructeur

public UserList(Context context, List<Users> user) { 
     this.context = context; 
     this.user = user; 
    fillData(); 
    } 

maintenant dans le processus de filtre classe

@Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults filterResults = new FilterResults(); 
      if (constraint != null && tempuser != null) { 

       boolean fillAll=false; 
       user.clear(); 
       if(constraint.toString().trim().length==0) 
        fillAll=true; 
       for(Users objUser:tempuser) 
       { 
        if(fillAll || constraint.toString().trim().toLowerCase().contains(objUser.value.toLowerCase()))///the objUser value replaced with your compare string 
        { 
        user.add(objUser); 
        } 
       } 
       filterResults.values = user; 
       filterResults.count = user.size(); 
      } 
      return filterResults; 
     } 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      user = (ArrayList<Users>) results.values; 
      if (results.count > 0) { 
       notifyDataSetChanged(); 
      } else { 
       notifyDataSetInvalidated(); 
      } 
     } 

vous pouvez essayer si un problème laissez-moi savoir, aussi si un utilisateur connaît l'approche standarad laissez-moi savoir

+0

accident sur la méthode avec refrence null: fillData private void() { // initialize tempuserhere (utilisateurs obj: l'utilisateur) { tempuser.add (OBJ); } } –

+0

vous devez l'initialiser tempuser = new Liste () quoi avant pour loop dans fillData check edit answer – Pavan