6

私は Android 開発に不慣れで、解決が難しい問題に遭遇しました。AutoCompleteTextViewウィジェットを適切に使用する方法を理解しようとしています。AutoCompleteTextViewWeb サービスの XML データを使用して を作成したいと考えています。私はそれを機能させることができましたが、私は間違いなく出力に満足していません.

HashMapwith id => name ペアを AutoCompleteTextView に入れて、クリックされたアイテムの ID を取得したいと思います。オートコンプリートのフィルタリングされたセットの出力をクリックすると、オートコンプリート ボックスの下にリストを入力したいと思いますが、これもうまくいきました。

これまでに行われたこと:

  • オートコンプリートは単純な場合にうまく機能しArrayList、すべてのデータが正しくフィルタリングされます
  • onItemClickクリック後にイベントが適切に発生する
  • parent.getItemAtPosition(position)String クリックされたアイテムの正しい表現を返します

イベントonItemClick(AdapterView parent, View v, int position, long id)が希望どおりに動作しません。クリックされた項目のフィルター処理されていない配列の位置を特定するにはどうすればよいですか? フィルタリングされたものの位置は、私が興味を持っていないものです。

その他の質問:

  • 取り扱い方法HashMapsCollectionsAutoCompleteTextView
  • イベントで権利を取得するitemId方法onItemClick

この問題について非常に広範な調査を行いましたが、私の質問に答える価値のある情報は見つかりませんでした。

4

4 に答える 4

13

イベント onItemClick(AdapterView parent, View v, int position, long id) が思い通りに動作しません。

これは、アダプタをフィルタリングするときの通常の状況です。アダプターは、フィルター処理されていない最初のデータへの参照をその観点から保持しますが、基になる単一のデータ セットがあります (それが最初のデータであるか、フィルター操作の結果であるかは関係ありません)。しかし、これで問題が発生することはありません。デフォルトの sdk アダプター (またはサブクラス) を使用すると、アダプターが基づいている現在のリストを取得onItemClick()できます。次に、そのデータ項目を取得するために使用できます(ここでも、初期かフィルターかは問題ではありません)。positiongetItem()position

String data = getItem(position);
int realPosition = list.indexOf(data); // if you want to know the unfiltered position

これは、リストとMaps(を使用すると仮定してSimpleAdapter) で機能します。また、 a のMaps場合は、追加のキーを追加して、最初のリストでフィルター処理されていない位置を設定するオプションが常にあります。

独自のアダプターと一緒に使用する場合は、正しい位置にすることがAutoCompleteTextViewできます (ただし、位置は変更できません)。onItemClick()id

public class SpecialAutoComplete extends AutoCompleteTextView {

    public SpecialAutoComplete(Context context) {
        super(context);
    }

    @Override
    public void onFilterComplete(int count) {
        // this will be called when the adapter finished the filter
        // operation and it notifies the AutoCompleteTextView
        long[] realIds = new long[count]; // this will hold the real ids from our maps
        for (int i = 0; i < count; i++) {
            final HashMap<String, String> item = (HashMap<String, String>) getAdapter()
                    .getItem(i);
            realIds[i] = Long.valueOf(item.get("id")); // get the ids from the filtered items
        }
        // update the adapter with the real ids so it has the proper data
        ((SimpleAdapterExtension) getAdapter()).setRealIds(realIds);
        super.onFilterComplete(count);
    }


}

そしてアダプター:

public class SimpleAdapterExtension extends SimpleAdapter {

    private List<? extends Map<String, String>> mData;
    private long[] mCurrentIds;

    public SimpleAdapterExtension(Context context,
            List<? extends Map<String, String>> data, int resource,
            String[] from, int[] to) {
        super(context, data, resource, from, to);
        mData = data;
    }

    @Override
    public long getItemId(int position) {       
        // this will be used to get the id provided to the onItemClick callback
        return mCurrentIds[position];
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

    public void setRealIds(long[] realIds) {
        mCurrentIds = realIds;
    }

}

アダプターのクラスも実装すると、Filterクラスをオーバーライドしなくても、そこから ID を取得できますAutoCompleTextView

于 2013-06-15T10:23:18.637 に答える
1

AutoCompleteTextView の onItemClickListener を実装し、リストで indexOf を使用して、選択した項目のインデックスを見つけます。

actvCity.setOnItemClickListener(new OnItemClickListener() {

     @Override
     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
          long arg3) {
          int index = cityNames.indexOf(actvCity.getText().toString());
          // Do Whatever you want to do ;)
     }
});
于 2014-11-18T09:15:06.377 に答える
0

最初にカスタム配列リストにデータを追加します

    // mList used for adding custom data into your model
        private List<OutletListSRModel> mList = new ArrayList<>();
      // listdata used for adding string data for auto completing.
        ArrayList<String> listdata = new ArrayList<String>();
        for (int i = 0; i < JArray.length(); i++) {
           JSONObject responseJson = JArray.getJSONObject(i);
           OutletListSRModel mModel = new OutletListSRModel();
           mModel.setId(responseJson.getString("id"));
           mModel.name(responseJson.getString("outlet_name"));
           listdata.add(responseJson.getString("outlet_name"));
        }

    ArrayAdapter adapter = new
                            ArrayAdapter(getActivity(),
 android.R.layout.simple_list_item_1, listdata);
    searchOutletKey.setAdapter(adapter);

上で追加したモデルから任意の値を取得します。このように取得できます。

searchOutletKey.setOnItemClickListener ( new AdapterView.OnItemClickListener ( ) {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String txtOutletId = mOutletListSRModel.get(position).getId();
            }
        });
于 2016-12-08T09:10:44.923 に答える