简体   繁体   English

ListView的Android筛选器arrayAdapter不起作用

[英]Android Filter arrayAdapter of ListView doesn't work

您好,我有一个edittext并且如果我键入某些内容,则Listview将被filtered并仅显示输入的值(如果它在列表中),我尝试了很多方法,但没有任何效果。

Change your adapter by below code: 通过以下代码更改适配器:

   public class CustomListviewAdapter extends ArrayAdapter<Personne> implements Filterable {

       private LayoutInflater inflater;
       private ArrayList<Personne> data;
       private ArrayList<Personne> filteredData = null;
       private Activity mContext;
       private int layoutResourceId;

       public CustomListviewAdapter(Activity context, int resource, ArrayList<Personne> objects) {

           super(context, resource, objects);
           data = objects;
           filteredData = objects;
           mContext = context;
           layoutResourceId = resource;

       }

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

       @Override
       public Personne getItem(int position) {
           return super.getItem(position);
       }

       @Override
       public int getPosition(Personne item) {
           return super.getPosition(item);
       }

       @Override
       public long getItemId(int position) {
           return super.getItemId(position);
       }

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

           View row = convertView;
           ViewHolder viewHolder = null;

           if (row == null) {

               inflater = LayoutInflater.from(mContext);
               row = inflater.inflate(layoutResourceId, parent, false);

               viewHolder = new ViewHolder();

               viewHolder.imageView = (ImageView) row.findViewById(R.id.icon);
               viewHolder.nom = (TextView) row.findViewById(R.id.nameLabel);
               viewHolder.pseudo = (TextView) row.findViewById(R.id.usernameLabel);
               viewHolder.email = (TextView) row.findViewById(R.id.emailLabel);

               row.setTag(viewHolder);

           }
           else {

               viewHolder = (ViewHolder) row.getTag();

           }

           viewHolder.personne = filteredData.get(position);

           viewHolder.nom.setText("Nom: " + viewHolder.personne.getNom());
           viewHolder.pseudo.setText("Pseudo: "  + viewHolder.personne.getUsername());
           viewHolder.email.setText("Email: "  +            viewHolder.personne.getEmail());

           return row;

       }




Filter filter = new Filter() {
  @Override
  protected FilterResults performFiltering(CharSequence constraint) {
       String filterString = constraint.toString().toLowerCase();
       FilterResults results = new FilterResults();
       final List<String> tempList = data ;
       int count = tempList.size();
       final ArrayList<String> nlist = new ArrayList<String>(count);
       String filterableString ;
       for (int i = 0; i < count; i++) {
            filterableString = tempList.get(i).getUserName();
            if (filterableString.toLowerCase().contains(filterString)) {
                nlist.add(filterableString);
             }
       }
       results.values = nlist;
       results.count = nlist.size();
       return results;
   }

  @SuppressWarnings("unchecked")
  @Override
  protected void publishResults(CharSequence constraint, FilterResults results) {
       filteredData = (ArrayList<String>) results.values;
       notifyDataSetChanged();
       }
}



       public class ViewHolder {

           private Personne personne;
           private TextView nom;
           private TextView pseudo;
           private TextView email;

       }
   }

Change you adapter code to below code: 将您的适配器代码更改为以下代码:

public class CustomListviewAdapter extends ArrayAdapter<Personne> {

private LayoutInflater inflater;
private ArrayList<Personne> data;
private ArrayList<Personne> tempList;
private Activity mContext;
private int layoutResourceId;

public CustomListviewAdapter(Activity context, int resource, ArrayList<Personne> objects) {
    data = objects;
    tempList = new ArrayList<>();
    tempList.addAll(data);
    mContext = context;
    layoutResourceId = resource;
    super(context, resource, tempList);        
}

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

@Override
public Personne getItem(int position) {
    return super.getItem(position);
}

@Override
public int getPosition(Personne item) {
    return super.getPosition(item);
}

@Override
public long getItemId(int position) {
    return super.getItemId(position);
}

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

    View row = convertView;
    ViewHolder viewHolder = null;

    if (row == null) {

        inflater = LayoutInflater.from(mContext);
        row = inflater.inflate(layoutResourceId, parent, false);

        viewHolder = new ViewHolder();

        viewHolder.imageView = (ImageView) row.findViewById(R.id.icon);
        viewHolder.nom = (TextView) row.findViewById(R.id.nameLabel);
        viewHolder.pseudo = (TextView) row.findViewById(R.id.usernameLabel);
        viewHolder.email = (TextView) row.findViewById(R.id.emailLabel);

        row.setTag(viewHolder);

    }
    else {

        viewHolder = (ViewHolder) row.getTag();

    }

    viewHolder.personne = tempList.get(position);

    viewHolder.nom.setText("Nom: " + viewHolder.personne.getNom());
    viewHolder.pseudo.setText("Pseudo: "  + viewHolder.personne.getUsername());
    viewHolder.email.setText("Email: "  + viewHolder.personne.getEmail());
    return row;

}

public void filter(String text) {
    if(text != null && data!=null) {
        int length=data.size();
        int i=0;
        tempList.clear();
        if(text.isEmpty()){
            tempList.addAll(data);
        } else{
            while(i<length){
                Personne item=data.get(i);
                String username = item.getUsername();
                if (username.toLowerCase().startsWith(text.toLowerCase())) {
                    tempList.add(item);
                }
                i++;
            }
        }
        notifyDataSetChanged();
    }
}

public class ViewHolder {

    private Personne personne;
    private TextView nom;
    private TextView pseudo;
    private TextView email;

}

}

Basically I am trying to maintain a main list of data and temporary list which will be used to filtered data taken from main list. 基本上,我试图维护一个主数据列表和一个临时列表,这些列表将用于过滤从主列表中获取的数据。 And the above code is filtering based on username , if you want some other parameter to be added for searching you can add/edit the if condition inside while loop of filter method. 上面的代码基于username过滤,如果您想添加其他参数进行搜索,则可以在filter方法的while循环内添加/编辑if条件。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM