因为我想使用“自定义列表适配器”,以便可以为列表设置样式,但“过滤器”功能无法正常工作.我可以使用基本的过滤功能,但是一旦过滤结果列表小于我开始过滤时显示的ListItems数量,应用程序就会崩溃.
这段代码中还有第二个问题,我不确定是否相关,但是何时
明确();在publishResults中运行,然后应用程序也崩溃.
这是我正在使用的代码.
package com.androID.example;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.List;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.TextVIEw;public class Customlistadapter extends ArrayAdapter<String> { private Context mContext; private String[] items;private String[] filtered;public Customlistadapter(Context context, int textVIEwResourceID, String[] items) { super(context, textVIEwResourceID, items); this.filtered = items; this.items = filtered; setNotifyOnChange(true); mContext = context;}@OverrIDepublic VIEw getVIEw(int position, VIEw convertVIEw, VIEwGroup parent) { VIEw v = convertVIEw; if (v == null) { LayoutInflater vi = (LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.List_item, null); } String o = filtered[position]; if (o != null) { TextVIEw tt = (TextVIEw) v.findVIEwByID(R.ID.tvVIEwRow); if (tt != null) { tt.setText("name: "+o); } } return v;}public voID notifyDataSetInvalIDated(){ super.notifyDataSetInvalIDated();}private Filter filter;public Filter getFilter(){ if(filter == null) filter = new nameFilter(); return filter;}private class nameFilter extends Filter{ @OverrIDe protected FilterResults performFiltering(CharSequence constraint) { // NOTE: this function is *always* called from a background thread, and // not the UI thread. constraint = constraint.toString().tolowerCase(); FilterResults result = new FilterResults(); if(constraint != null && constraint.toString().length() > 0) { ArrayList<String> filt = new ArrayList<String>(); List<String> litems = new ArrayList<String>(); synchronized (items) { litems = Arrays.asList(items); //Collections.copy(litems, Arrays.asList(items)); } for(int i = 0, l = litems.size(); i < l; i++) { String m = litems.get(i); if(m.tolowerCase().startsWith(constraint.toString())) filt.add(m); } result.count = filt.size(); result.values = filt.toArray(new String[0]); } else { synchronized(items) { result.values = items; result.count = Arrays.asList(items).size(); } } return result; } @OverrIDe protected voID publishResults(CharSequence constraint, FilterResults results) { // NOTE: this function is *always* called from the UI thread. filtered = (String[])results.values; notifyDataSetChanged(); clear(); notifyDataSetInvalIDated(); }}
}
解决方法:
我只是有同样的问题.只需将getCount()方法放在适配器类中即可.它应该返回过滤后的计数.像这样:
public int getCount() { return mItems.size(); }
我过滤了mItems.
总结以上是内存溢出为你收集整理的Android ArrayAdapter过滤问题全部内容,希望文章能够帮你解决Android ArrayAdapter过滤问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)