【发布时间】:2023-03-24 06:22:01
【问题描述】:
看来这应该很容易。
我有一个使用 ArrayAdapter 的带有列表的 Android 应用程序。有用。我用自定义子类替换了 ArrayAdapter。有用。我添加了一个内部类,它是 Filter 的子类,并将 ArrayAdaptor 子类标记为实现 Fiterable。它工作正常,只是它不过滤。
我要在这里说什么神奇的词?
过滤器子类中的任何方法都没有被调用。
public class XYZListAdapter extends ArrayAdapter<XYZListFragment.XYZItem> implements Filterable {
private List<XYZListFragment.XYZItem> sourceObjects;
private Context sourceContext;
private XYZFilter xyzFilter;
public XYZListAdapter(Context context, int resource, int textViewResourceId, List<XYZListFragment.XYZItem> objects) {
super(context, resource, textViewResourceId, objects);
sourceObjects = new ArrayList<>(objects);
sourceContext = context;
}
public View getView(int position, View convertView, ViewGroup parent) {
Log.i("XYZAdapter", "getView");
View v = convertView;
if (v == null) {
v = ((LayoutInflater)sourceContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.fragment_xyz_list_item, parent, false);
}
XYZListFragment.XYZItem mItem = sourceObjects.get(position);
if (mItem != null) {
TextView t = (TextView)v.findViewById(R.id.xyz_list_item_name_view);
if (t != null) {
t.setText(mItem.name());
}
}
return v;
}
@Override
public Filter getFilter() {
Log.i("XYZAdapter", "getFilter");
if (xyzFilter == null)
xyzFilter = new XYZFilter();
return xyzFilter;
}
private class XYZFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
Log.i("XYZFilter", "perform");
FilterResults results = new FilterResults();
if (constraint == null || constraint.length() == 0) {
results.values = sourceObjects;
results.count = sourceObjects.size();
}
else {
List<XYZListFragment.XYZItem> nextXYZList = new ArrayList<>();
for (XYZListFragment.XYZItem p : sourceObjects) {
if (p.name().toUpperCase().startsWith(constraint.toString().toUpperCase()))
nextXYZList.add(p);
}
results.values = nextXYZList;
results.count = nextXYZList.size();
}
return results;
}
@Override
@SuppressWarnings("unchecked")
protected void publishResults(CharSequence constraint, FilterResults results) {
Log.i("XYZFilter", "publish");
if (results.count == 0)
notifyDataSetInvalidated();
else {
sourceObjects = (List<XYZListFragment.XYZItem>) results.values;
notifyDataSetChanged();
}
}
}
}
【问题讨论】:
-
我现在使用的是 SimpleCursorAdaptor。反正这里没有答案,所以……啦。
标签: android android-arrayadapter android-filterable