2012-07-17 9 views
5

私はAndroid開発には新しく、解決するのが難しい問題に遭遇しました。 AutoCompleteTextViewウィジェットを正しく使用する方法を理解しようとしています。 WebサービスからXMLデータを使用してAutoCompleteTextViewを作成したいと思います。私はそれをうまく動作させることができましたが、私は退屈な結果に満足していません。AutoCompleteTextViewアダプタの正しいIDを取得する方法

id =>名前ペアを持つHashMapをAutoCompleteTextViewに配置し、クリックしたアイテムのIDを取得したいとします。オートコンプリートフィルタを適用した出力をクリックすると、オートコンプリートボックスの下にリストを作成したいと思います。

は、これまでに完了:

  • オートコンプリートは、単純なArrayListに適しています、すべてのデータが正しい をフィルタリング
  • onItemClickイベントが発生し、適切
  • parent.getItemAtPosition(position)戻り、正しいクリックした項目のString 表現クリックした後

前夜nt onItemClick(AdapterView parent, View v, int position, long id)は私が望むように動作しません。クリックされたアイテムのフィルタリングされていない配列の位置を調べるにはどうすればよいですか?フィルタ1の位置は、私は興味がないです

さらに質問:。onItemClickイベントで右itemIdを取得する方法AutoCompleteTextView

  • HashMapsまたはCollectionsを処理する方法

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

  • +0

    PLSのは、友人 – sarath

    +0

    海の友人に私を助けて、私はこの問題を解決しようとしましたが...私はアンドロイドの虎から何の解決策をwonder.Whyないことができませんでした? –

    答えて

    13

    イベントonItemClick(AdapterView親、ビューv、int位置、long id)は、私が望むように動作しません。

    これは、アダプターをフィルターに掛けるときの通常の状況です。アダプタは、フィルタリングされていない初期のデータへの参照をその観点から保持していますが、アダプタの初期のデータであるかフィルタ操作の結果であるかにかかわらず、単一のデータセットをベースにしています。しかし、これは問題を起こすべきではありません。デフォルトのsdkアダプタ(またはサブクラス)では、onItemClick()には、の現在のリストのpositionが表示されます。その後、getItem()を使用して、そのデータ項目を取得することができます。position(初期値かフィルタリングかは関係ありません)

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

    これは(あなたがSimpleAdapterを使用すると仮定して)リストやMapsのために動作します。 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クラスを実装する場合、あなたはAutoCompleTextViewクラスをオーバーライドすることなく、そこからIDを得ることができます。

    1

    Luksprogアプローチを使用して、私はArrayAdapterと似ています。

    public class SimpleAutoCompleteAdapter extends ArrayAdapter<String>{ 
         private String[] mData; 
         private int[] mCurrentIds; 
    
         public SimpleAutoCompleteAdapter(Context context, int textViewResourceId, 
          String[] objects) { 
          super(context, textViewResourceId, objects); 
          mData=objects; 
         } 
    
         @Override 
         public long getItemId(int position) { 
          String data = getItem(position); 
          int index = Arrays.asList(mData).indexOf(data); 
          /* 
          * Atention , if your list has more that one same String , you have to improve here 
          */ 
          // this will be used to get the id provided to the onItemClick callback 
          if (index>0) 
           return (long)mCurrentIds[index]; 
          else return 0; 
         } 
    
         @Override 
         public boolean hasStableIds() { 
          return true; 
         } 
    
         public void setRealIds(int[] realIds) { 
          mCurrentIds = realIds; 
         } 
    
        } 
    
    2

    、選択した項目のインデックスを見つけるために、あなたのリスト上のindexOfを使用し、AutoCompleteTextViewためonItemClickListenerを実装します。

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

    まず、我々は上記の追加モデルから任意の値を取得するためのカスタムArrayListの今

    // 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(); 
          } 
         }); 
    
    関連する問題