0

私はグーグルで検索していましたが、スタックオーバーは正確な解決策を見つけることができませんでした. 私の問題は、ArrayList<String>アダプターがあり、それが

  1. ゲートウィック ロンドン イングランド
  2. オリ パリ フランス
  3. ヒースロー ロンドン イングランド

ユーザーが「Lon」と入力するAutoCompleteTextViewと、行番号 1 と 3 を表示する必要があります。これらにはロンドン文字列があるためです。

このリンクを試して、ここにコードを貼り付けましたが、57行目に警告が表示されます

String prefix = constraint.toString().toLowerCase();

PkmnAdapter

public class PkmnAdapter extends ArrayAdapter<String> {

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

    public PkmnAdapter(Context context, int textViewResourceId,
            ArrayList<Pkmn> items) {
        super(context, textViewResourceId);
        this.original = new ArrayList<Pkmn>(items);
        this.fitems = new ArrayList<Pkmn>(items);
    }

    @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.row, null);
        }
        Pkmn pkmn = fitems.get(position);
        if (pkmn != null) {
            TextView tt = (TextView) v.findViewById(R.id.RlabPName);

            if (tt != null) {
                tt.setText(pkmn.getNAME());
            }
        }
        return v;
    }

    @Override
    public Filter getFilter() {
        if (filter == null)
            filter = new PkmnNameFilter();

        return filter;
    }

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

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

                for (int i = 0; i < count; i++) {
                    final Pkmn pkmn = list.get(i);
                    final String value = pkmn.getNAME().toLowerCase();

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

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {
            fitems = (ArrayList<Pkmn>) results.values;

            clear();
            if (fitems != null) {
                int count = fitems.size();
                for (int i = 0; i < count; i++) {
                    Pkmn pkmn = (Pkmn) fitems.get(i);
                    fitems.add(pkmn);
                }
            }
        }

    }
}

アダプタを配置するMainActivity.java

Pkmn[] item = new Pkmn[4];
item[0] = new Pkmn("Gatewick London England");
item[1] = new Pkmn("Ory Paris France");
item[2] = new Pkmn("Heathrow London England");
item[3] = new Pkmn("Ataturk Istanbul Turkey");

ArrayList<Pkmn> list = new ArrayList<Pkmn>(Arrays.asList(item));
MultiAutoCompleteTextView auto = (MultiAutoCompleteTextView) findViewById(R.id.multiAutoCompleteTextView1);
PkmnAdapter adap = new PkmnAdapter(this,android.R.layout.simple_list_item_1, list);
4

1 に答える 1

1

まず、「Lon」と入力した場合、要素が「Lon」で始まるかどうかをチェックしてはいけません。おそらく、if ステートメントを次のように切り替える必要があります。

 if (value.contains(prefix)) {
         nlist.add(pkmn);
 }

メソッドでフィルタリングを実行する前にperformFiltering()、制約が null かどうかを確認してください (ヒント:TextUtilsクラスを使用してください)。その場合は、元のデータを返します。したがって、NPE を回避しています。また、次のように NPE がスローされる可能性がある重要なポイントにも注意を払う必要があります。

 if (prefix == null || prefix.length() == 0) {   }

乾杯、

于 2013-03-24T13:50:58.197 に答える