5

ArrayAdapterで利用できるタイトル/サブタイトル ビューを使用できるように、カスタムがありますListView。文字列を受け入れてEditTextアダプターをフィルター処理する があります。

フィルターは、正しいオブジェクトをフィルタリングしているという意味で機能します (フィルターをクリックすると、正しい「エクストラ」でインテントが開始されます)。

ただし、フィルタリングが機能しても、アダプター内の項目が更新されず、正しい情報が表示されません... タイトルとサブタイトルが正しくありません。

にアイテム 0 ~ 9 があるListViewとします。検索で 3 つのアイテムにフィルターし、フィルターされたアイテムが 5、6、9 であるとします... 3 つのアイテムが表示されますが、元の pre の最初の 3 つのアイテムです。 -検索ListView(0-2)。項目 2 (3 番目の項目) をクリックすると、新しいインテントに 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 には、Filter のオーバーライドされた実装があります。コードは次のとおりです。

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();
        }
    }
}
}

Filter のカスタム実装により、検索時に表示が更新されたことがわかりました。うまくいけば、これは何人かの人々を助けるでしょう。

于 2012-08-12T04:48:33.817 に答える