android中阵列适配器的自定义过滤器 公共类SpotAdapter扩展了ArrayAdapter{ 私有数组列表mFilteredList、mUnfilteredList; 专用过滤器; 公共SpotAdapter(上下文上下文、int资源、列表项){ 超级(上下文、资源、项目); mUnfilteredList=(ArrayList)项; mFilteredList=(ArrayList)项; } @凌驾 公共视图getView(int位置、视图转换视图、视图组父视图){ 视图v=转换视图; 如果(v==null){ 拉平机vi; vi=LayoutInflater.from(getContext()); v=vi.充气(R.布局.记录行,空); } Spot p=(Spot)mFilteredList.get(位置); 如果(p!=null){ TextView名称视图=(TextView)v.findViewById(R.id.name); TextView地址视图=(TextView)v.findViewById(R.id.address); TextView类型视图=(TextView)v.findViewById(R.id.type); TextView contactView=(TextView)v.findViewById(R.id.contact); ImageView starBtn=(ImageView)v.findViewById(R.id.star); contactView.setVisibility(View.GONE); nameView.setText(p.name); addressView.setText(p.address); setText(p.type==1?“休闲”:“购物”); starBtn.setTag(“+p.id”); starBtn.setVisibility(p.isStar?View.VISIBLE:View.GONE); } 返回v; } @凌驾 公共过滤器getFilter(){ if(mFilter==null){ mFilter=新过滤器(){ @凌驾 受保护的void publishResults(CharSequence约束、FilterResults结果){ mFilteredList=(ArrayList)results.values; 清除(); int count=mFilteredList.size(); 对于(int i=0;i

android中阵列适配器的自定义过滤器 公共类SpotAdapter扩展了ArrayAdapter{ 私有数组列表mFilteredList、mUnfilteredList; 专用过滤器; 公共SpotAdapter(上下文上下文、int资源、列表项){ 超级(上下文、资源、项目); mUnfilteredList=(ArrayList)项; mFilteredList=(ArrayList)项; } @凌驾 公共视图getView(int位置、视图转换视图、视图组父视图){ 视图v=转换视图; 如果(v==null){ 拉平机vi; vi=LayoutInflater.from(getContext()); v=vi.充气(R.布局.记录行,空); } Spot p=(Spot)mFilteredList.get(位置); 如果(p!=null){ TextView名称视图=(TextView)v.findViewById(R.id.name); TextView地址视图=(TextView)v.findViewById(R.id.address); TextView类型视图=(TextView)v.findViewById(R.id.type); TextView contactView=(TextView)v.findViewById(R.id.contact); ImageView starBtn=(ImageView)v.findViewById(R.id.star); contactView.setVisibility(View.GONE); nameView.setText(p.name); addressView.setText(p.address); setText(p.type==1?“休闲”:“购物”); starBtn.setTag(“+p.id”); starBtn.setVisibility(p.isStar?View.VISIBLE:View.GONE); } 返回v; } @凌驾 公共过滤器getFilter(){ if(mFilter==null){ mFilter=新过滤器(){ @凌驾 受保护的void publishResults(CharSequence约束、FilterResults结果){ mFilteredList=(ArrayList)results.values; 清除(); int count=mFilteredList.size(); 对于(int i=0;i,android,listview,android-listview,filter,adapter,Android,Listview,Android Listview,Filter,Adapter,mFilteredList=new ArrayList(items);当您单击“书签”时,您在做什么?您的适配器是否连接到AutoCompleteTextView?您是否直接调用筛选器?直接调用筛选器,如下面的sAdapter.getFilter().filter(“全选”);sAdapter.getFilter().filter(“书签”);似乎您应该创建两个适配器,那么为什么mUnfilteredList会受到影响?我尝试在构造函数中登录,但它只运行mUnfilteredList=(Arra

mFilteredList=new ArrayList(items);

当您单击“书签”时,您在做什么?您的适配器是否连接到AutoCompleteTextView?您是否直接调用筛选器?直接调用筛选器,如下面的sAdapter.getFilter().filter(“全选”);sAdapter.getFilter().filter(“书签”);似乎您应该创建两个适配器,那么为什么mUnfilteredList会受到影响?我尝试在构造函数中登录,但它只运行mUnfilteredList=(ArrayList)项;1次,所以它不应该更改,谢谢我猜mUnfilteredList=(ArrayList)items;是错误的,它不应该指向items,但应该指向co-items copymFilteredList或mUnfilteredList?两者都需要是新的ArrayList(items)ok,因此我建议创建两个适配器,因为现在您有三个数据副本,这在大型数据集中可能是一个问题
public class SpotAdapter extends ArrayAdapter<Spot> {

    private ArrayList<Spot> mFilteredList, mUnfilteredList;
    private Filter mFilter;

    public SpotAdapter(Context context, int resource, List<Spot> items) {
        super(context, resource, items);
        mUnfilteredList = (ArrayList<Spot>) items;
        mFilteredList = (ArrayList<Spot>) items;
    }

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

        View v = convertView;

        if (v == null) {
            LayoutInflater vi;
            vi = LayoutInflater.from(getContext());
            v =  vi.inflate(R.layout.record_row, null);
        }

        Spot p = (Spot) mFilteredList.get(position);

        if (p != null) {
            TextView nameView = (TextView) v.findViewById(R.id.name);
            TextView addressView = (TextView) v.findViewById(R.id.address);
            TextView typeView = (TextView) v.findViewById(R.id.type);
            TextView contactView = (TextView) v.findViewById(R.id.contact);
            ImageView starBtn = (ImageView) v.findViewById(R.id.star);

            contactView.setVisibility(View.GONE);
            nameView.setText(p.name);
            addressView.setText(p.address);
            typeView.setText(p.type == 1 ? "Leisure" : "Shopping");
            starBtn.setTag("" + p.id);
            starBtn.setVisibility(p.isStar ? View.VISIBLE :  View.GONE);
        }

        return v;

    }

    @Override
    public Filter getFilter() {
        if(mFilter == null) {
            mFilter = new Filter() {

                @Override
                protected void publishResults(CharSequence constraint, FilterResults results) {
                    mFilteredList = (ArrayList<Spot>)results.values;
                    clear();
                    int count = mFilteredList.size();
                    for (int i=0; i<count; i++)
                    {
                        Spot s = (Spot)mFilteredList.get(i);
                        add(s);
                    }
//                  
//                  mFilteredList = (ArrayList<Spot>)results.values;
//                  notifyDataSetChanged();
                }

                @Override
                protected FilterResults performFiltering(CharSequence constraint) {
                    Log.d("test1","c "+constraint);
                    Log.d("test1","s "+mUnfilteredList.size());

                    FilterResults results = new FilterResults();
                    ArrayList<Spot> newList = new ArrayList<Spot>();              
                    for (Spot obj : mUnfilteredList) {
                        // Compare the custom object and add to list if match
                        if (constraint.equals("bookmark")) {  
                            if (obj.isStar == true)
                                newList.add(obj); 
                        } else if (constraint.equals("select all")) {
                            newList.add(obj);
                        }
                    }

                    Log.d("test1",""+newList.size());
                    results.values = newList;
                    results.count = newList.size();
                    return results;
                }
            };
        }
        return mFilter;
    }

}