5

所以我有一个自定义ArrayAdapter,所以我可以使用ListView. 我有一个EditText接受字符串并过滤适配器的。

过滤器在过滤正确对象的意义上起作用(我可以通过单击它来判断它并以正确的“附加”开始意图。)

但是,即使过滤有效,适配器中的项目也不会更新以显示正确的信息......标题和副标题不正确。

假设我们在 0 到 9 上有项目ListView,我通过搜索过滤到 3 个项目,假设过滤后的项目是 5、6、9... 显示 3 个项目,但它是原始 pre 的前 3 个项目-搜索ListView(0-2)。如果我单击第 2 项(第三项),则 9 的内容包含在新意图中。这对于搜索条件是正确的,但是标题确实反映了正确的信息。

我不确定我需要告诉ListView刷新什么。我不认为它notifyDataSetChanged();

任何帮助表示赞赏。谢谢!

    public class myListAdapter extends ArrayAdapter<Pizza>{
    private ArrayList<Pizza> items;
    private PizzaViewHolder myListHolder;

    private class PizzaViewHolder{
        TextView title;
        TextView subtitle;
    }

    public myListAdapter(Context context, int textViewResourceId, ArrayList<Pizza> items) {
        super(context, textViewResourceId, items);
        this.items = items;
        // TODO Auto-generated constructor stub
    }

    @Override
    public View getView(int pos, View convertView, ViewGroup parent){
        View v = convertView;
        if(v == null){
            LayoutInflater vi = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.myList_item, null);
            myListHolder = new PizzaViewHolder();
            myListHolder.title = (TextView)v.findViewById(R.id.title);
            myListHolder.subtitle = (TextView)v.findViewById(R.id.subtitle);
            v.setTag(myListHolder);
        }else myListHolder = (PizzaViewHolder)v.getTag();

        Pizza myList = items.get(pos);

        if (myList != null){
            myListHolder.title.setText(myList.getTitle());
            myListHolder.subtitle.setText(myList.getSubTitle());
        }       
        return v;           
    }
}

这是搜索

    private TextWatcher filterTextWatcher = new TextWatcher(){

    public void afterTextChanged(Editable s) {
        // TODO Auto-generated method stub
        if(!s.equals("")){  
            ((Filterable) this.listView1.getAdapter()).getFilter().filter(s);
            }
    }

    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
        // TODO Auto-generated method stub

    }

    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
        // TODO Auto-generated method stub

    }

};
4

1 回答 1

14

根据我的确定,我的自定义 ArrayAdapter 似乎需要一个自定义过滤器。自定义 ArrayAdapter 有一个过滤器的重写实现,这里是代码:

import java.util.ArrayList;
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.TextView;

public class PizzaAdapter extends ArrayAdapter<Pizza>{

private ArrayList<Pizza> original;
private ArrayList<Pizza> fitems;
private Filter filter;


public PizzaAdapter(Context context, int textViewResourceId, ArrayList<Pizza> items) {
    super(context, textViewResourceId, items);

    this.original = new ArrayList<Pizza>(items);
    this.fitems = new ArrayList<Pizza>(items);
    this.filter = new PizzaFilter();
}

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

    if(v == null){
        LayoutInflater vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        v = vi.inflate(R.layout.pizza_list_item, null);
    }

    Pizza pizza = fitems.get(position);

    if(pizza != null){
        String subtitleString = new String("[" + pizza.getPizzaType() + "]   " + pizza.getPizzaCategory() + ": " + pizza.getPizzaCode());

        TextView title = (TextView)v.findViewById(R.id.title);
        TextView subtitle = (TextView)v.findViewById(R.id.subtitle);

        if(title != null){
            title.setText(pizza.getPizzaName());
        }
        if(subtitle != null){
            subtitle.setText(subtitleString);
        }
    }
    return v;
}

@Override
public Filter getFilter(){

    if(filter == null){
        filter = new PizzaFilter();
    }
    return filter;
}

private class PizzaFilter extends Filter{
    @Override
    protected FilterResults performFiltering(CharSequence constraint){
        FilterResults results = new FilterResults();
        String prefix = constraint.toString().toLowerCase();

        if (prefix == null || prefix.length() == 0){
            ArrayList<Pizza> list = new ArrayList<Pizza>(original);
            results.values = list;
            results.count = list.size();
        }else{
            final ArrayList<Pizza> list = new ArrayList<Pizza>(original);
            final ArrayList<Pizza> nlist = new ArrayList<Pizza>();
            int count = list.size();

            for (int i = 0; i<count; i++){
                final Pizza pizza = list.get(i);
                final String value = Pizza.getPizzaName().toLowerCase();

                if(value.contains(prefix)){
                    nlist.add(pizza);
                }
                results.values = nlist;
                results.count = nlist.size();
            }
        }
        return results;
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        fitems = (ArrayList<Pizza>)results.values;
        notifyDataSetChanged();
        clear();
        int count = fitems.size();
        for(int i = 0; i<count; i++){
            add(fitems.get(i));
            notifyDataSetInvalidated();
        }
    }
}
}

事实证明,过滤器的自定义实现会在您搜索时更新显示。希望这会帮助一些人。

于 2012-08-12T04:48:33.817 回答