2012-07-17 4 views
5

Ich bin neu in der Android-Entwicklung und bin auf ein Problem gestoßen, das ich schwierig zu lösen finde. Ich versuche herauszufinden, wie man ein AutoCompleteTextView Widget richtig verwendet. Ich möchte ein AutoCompleteTextView erstellen, XML-Daten von einem Webdienst verwenden. Ich habe es geschafft, es zu arbeiten, aber ich bin definitiv nicht zufrieden mit der Ausgabe.So erhalten Sie die richtige ID des AutoCompleteTextView-Adapters

Ich würde gerne eine HashMap mit ID => Name Paare in die AutoCompleteTextView und holen Sie sich die ID des angeklickten Elements. Wenn ich auf die gefilterte Ausgabe des Autocomplete-Filters klicke, möchte ich eine Liste unter der Autokomplettierungsbox auffüllen, die ich ebenfalls zum Laufen gebracht habe.

bisher getan:

  • zur automatischen Vervollständigung gut für einfache ArrayList funktioniert, alle
  • korrekt gefilterten Daten
  • onItemClick Ereignis ausgelöst wird ordnungsgemäß nach Klick
  • parent.getItemAtPosition(position) kehrt richtig String Darstellung des angeklickten Artikel

Der Abend nt onItemClick(AdapterView parent, View v, int position, long id) verhält sich nicht wie ich möchte. Wie kann ich die ungefilterte Array-Position des angeklickten Objekts herausfinden? Die Position des gefilterten ist diejenige, die ich nicht interessiert bin

Weitere Fragen:.

  • Wie in hand HashMaps oder CollectionsAutoCompleteTextView
  • Wie Sie die richtigen itemId im onItemClick Ereignisse bekommen

Ich habe sehr umfangreiche Recherchen zu diesem Thema, fand aber keine wertvollen Informationen, die meine Fragen beantworten würden.

+0

Pls helfen mir Freunde – sarath

+0

Hai Freund, habe ich versucht, dieses Problem zu lösen, konnte aber nicht ... ich wonder.Why keine Lösungen aus dem Android Tiger ??? –

Antwort

13

Das Ereignis onItemClick (AdapterView übergeordnet, Ansicht v, int Position, lange id) verhält sich nicht wie ich möchte.

Dies ist eine normale Situation beim Filtern eines Adapters. Obwohl der Adapter einen Verweis auf die ursprünglichen ungefilterten Daten von seinem Standpunkt aus behält, hat er einen einzelnen Satz von Daten, auf dem er basiert (unabhängig davon, ob es sich um den ursprünglichen oder um einen Filtervorgang handelt). Aber das sollte keine Probleme aufwerfen. Mit den Standard-SDK-Adaptern (oder mit einer Unterklasse) erhalten Sie in der onItemClick() die position für die aktuelle Liste, auf der der Adapter basiert. Sie könnten dann getItem() verwenden, um ein Datenelement für diese position zu erhalten (auch hier ist es egal, ob initial oder gefiltert).

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

dies für Listen arbeiten und Maps (unter der Annahme, dass Sie die SimpleAdapter verwenden). Und für eine Maps haben Sie immer die Möglichkeit, einen zusätzlichen Schlüssel hinzuzufügen, um die ungefilterte Position in der ursprünglichen Liste festzulegen.

Wenn Sie Ihren eigenen Adapter zusammen mit einem AutoCompleteTextView verwenden, können Sie die onItemClick() geben Sie das richtige id (die Position, aber Sie können nicht ändern).

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


} 

und der Adapter:

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

} 

Wenn Sie auch die Filter Klasse für den dann Adapter implementieren Sie die IDs von dort ohne die Notwendigkeit erhalten könnten die AutoCompleTextView Klasse außer Kraft zu setzen.

1

Mit dem Luksprog-Ansatz habe ich einige ähnliche mit ArrayAdapter gemacht.

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

Implementieren onItemClickListener für AutoCompleteTextView, verwenden Sie dann indexOf auf Ihrer Liste den Index des ausgewählten Elements zu finden.

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

zuerst Ihre Daten in benutzerdefinierten Arraylist hinzufügen

// 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); 

nun einen beliebigen Wert von Modell für das Erhalten, die wir oben gegeben. wir können so kommen.

searchOutletKey.setOnItemClickListener (new AdapterView.OnItemClickListener () { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       String txtOutletId = mOutletListSRModel.get(position).getId(); 
      } 
     }); 
Verwandte Themen