使用getFilter函数时,ListView为空白

我正在尝试在ListView实现getFilter()函数,但每次我在EditText输入内容时,我的ListView消失。

我的SetHelpRows文件:

 public class SetHelpRows { String name; String id; public String getName () { return name; } public void setName (String name) { this.name = name; } public String getID () { return id; } public void setID (String id) { this.id = id; } public SetHelpRows(String name, String id) { super(); this.name = name; this.id = id; } } 

我的SetHelpRowsCustomAdapter文件:

 import java.util.ArrayList; import android.app.Activity; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Filter; import android.widget.ImageView; import android.widget.TextView; public class SetRowsCustomAdapter extends ArrayAdapter { Context context; int layoutResourceId; ArrayList data=new ArrayList(); private ArrayList original; private ArrayList fitems; private Filter filter; public SetRowsCustomAdapter(Context context, int layoutResourceId, ArrayList data) { super(context, layoutResourceId, data); this.layoutResourceId = layoutResourceId; this.context = context; this.data = data; this.original = data;//new ArrayList(); this.fitems = data;//new ArrayList(); } @Override public View getView(int position, View convertView, ViewGroup parent) { View row = convertView; ImageHolder holder = null; if(row == null) { LayoutInflater inflater = ((Activity)context).getLayoutInflater(); row = inflater.inflate(layoutResourceId, parent, false); holder = new ImageHolder(); holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle); holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon); holder.txtID = (TextView)row.findViewById(R.id.txtModDate); row.setTag(holder); } else { holder = (ImageHolder)row.getTag(); } SetRows myImage = data.get(position); holder.txtTitle.setText(myImage.name); holder.txtID.setText(myImage.id); int outImage=myImage.image; holder.imgIcon.setImageResource(outImage); return row; } static class ImageHolder { ImageView imgIcon; TextView txtTitle; TextView txtID; } @Override public Filter getFilter() { if (filter == null) { Log.i("Before Filter", "Before Filter"); filter = new PkmnNameFilter(); } return filter; } private class PkmnNameFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { FilterResults results = new FilterResults(); String prefix = constraint.toString().toLowerCase(); if (prefix == null || prefix.length() == 0) { Log.i("prefix is null or 0", "prefix is null or 0"); ArrayList list = new ArrayList(original); results.values = list; results.count = list.size(); } else { Log.i("prefix is !null or !0", "prefix is !null or !0"); final ArrayList list = new ArrayList(original); final ArrayList nlist = new ArrayList(); int count = list.size(); for (int i=0; i<count; i++) { final SetRows pkmn = list.get(i); final String value = pkmn.getName().toLowerCase(); if (value.startsWith(prefix)) { nlist.add(pkmn); } } results.values = nlist; results.count = nlist.size(); } return results; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { Log.i("publish result", "publish result"); fitems = (ArrayList)results.values; clear(); int count = fitems.size(); for (int i=0; i<count; i++) { SetRows pkmn = (SetRows)fitems.get(i); add(pkmn); } } } } 

我的部分MainActivity文件:

 inputSearch = (EditText) findViewById(R.id.etSearch); dataList = (ListView) findViewById(R.id.lvFiles); for (int y=0; y<strNames.length;y++) { name = strNamesOfAllah[y]; meaning = strMeaning[y]; rowsArray.add(new SetRows(R.drawable.icon, name, meaning)); } adapter = new SetRowsCustomAdapter(MainActivity.this, R.layout.customlist, rowsArray); dataList.setAdapter(adapter); dataList.setClickable(true); inputSearch.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { // When user changed the Text //MainActivity.this.adapter.getFilter().filter(cs); //String text = inputSearch.getText().toString().toLowerCase(); adapter.getFilter().filter(cs.toString().toLowerCase(Locale.US)); } @Override public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { //TODO Auto-generated method stub } @Override public void afterTextChanged(Editable arg0) { //TODO Auto-generated method stub } }); 

LogCat我看到以下内容:

 12-12 12:15:57.077: I/Before Filter(720): Before Filter 12-12 12:15:57.106: I/prefix is !null or !0(720): prefix is !null or !0 12-12 12:15:57.216: I/publish result(720): publish result 

我修改了我的代码并且能够让它运行起来。 如果有人想使用它,请成为我的客人:)

SetRows Java文件:

 public class SetRows { int image; String name; String id; public int getImage () { return image; } public void setImage (int image) { this.image = image; } public String getName () { return name; } public void setName (String name) { this.name = name; } public String getID () { return id; } public void setID (String id) { this.id = id; } public SetRows(int image, String name, String id) { super(); this.image = image; this.name = name; this.id = id; } @Override public String toString() { return image + " " + name + " " + id; } } 

SetRowsCustomAdapter Java文件:

 import java.util.ArrayList; import android.app.Activity; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Filter; import android.widget.ImageView; import android.widget.TextView; public class SetRowsCustomAdapter extends ArrayAdapter { Context context; int layoutResourceId; ArrayList data=new ArrayList(); //data = countryList private ArrayList originalList; private NameFilter filter; public SetRowsCustomAdapter(Context context, int layoutResourceId, ArrayList data) { super(context, layoutResourceId, data); this.layoutResourceId = layoutResourceId; this.context = context; this.data = data; //this.data.addAll(data); this.originalList = new ArrayList(); this.originalList.addAll(data); } @Override public View getView(int position, View convertView, ViewGroup parent) { View row = convertView; ImageHolder holder = null; if(row == null) { LayoutInflater inflater = ((Activity)context).getLayoutInflater(); row = inflater.inflate(layoutResourceId, parent, false); holder = new ImageHolder(); holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle); holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon); holder.txtID = (TextView)row.findViewById(R.id.txtModDate); row.setTag(holder); } else { holder = (ImageHolder)row.getTag(); } SetRows myImage = data.get(position); holder.txtTitle.setText(myImage.name); holder.txtID.setText(myImage.id); int outImage=myImage.image; holder.imgIcon.setImageResource(outImage); return row; } static class ImageHolder { ImageView imgIcon; TextView txtTitle; TextView txtID; } @Override public Filter getFilter() { if (filter == null){ filter = new NameFilter(); } return filter; } private class NameFilter extends Filter { @Override protected FilterResults performFiltering(CharSequence constraint) { constraint = constraint.toString().toLowerCase(); FilterResults result = new FilterResults(); if(constraint != null && constraint.toString().length() > 0) { ArrayList filteredItems = new ArrayList(); for(int i = 0, l = originalList.size(); i < l; i++) { SetRows nameList = originalList.get(i); if(nameList.toString().toLowerCase().contains(constraint)) filteredItems.add(nameList); } result.count = filteredItems.size(); result.values = filteredItems; } else { synchronized(this) { result.values = originalList; result.count = originalList.size(); } } return result; } @SuppressWarnings("unchecked") @Override protected void publishResults(CharSequence constraint, FilterResults results) { data = (ArrayList)results.values; notifyDataSetChanged(); clear(); for(int i = 0, l = data.size(); i < l; i++) add(data.get(i)); notifyDataSetInvalidated(); } } } 

其他一切都保持不变:)

我希望人们发现它对自己的应用程序有用。

您不需要实现自己的Filter ,如果您使用的是ArrayAdapter ,则只需覆盖SetHelpRowstoString方法即可返回名称。 然后,您可以调用ArrayAdapter的内置Filter

这不是您问题的直接答案,而是改变您的实施的建议。

请在您的publishResults函数中尝试此操作

  @Override protected void publishResults(CharSequence constraint, FilterResults results) { Log.i("publish result", "publish result"); data = (ArrayList)results.values; notifyDataSetChanged(); } 

在接受的答案中,可以通过覆盖getCount()来改进Filter

 @override public int getCount(){ return data.size();