[英]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.