2012-07-17 30 views
5

Tôi mới phát triển Android và tôi gặp phải sự cố mà tôi thấy khó giải quyết. Tôi đang cố gắng tìm ra cách sử dụng tiện ích AutoCompleteTextView đúng cách. Tôi muốn tạo một AutoCompleteTextView, sử dụng dữ liệu XML từ một dịch vụ web. Tôi đã cố gắng làm cho nó hoạt động, nhưng tôi không hài lòng với kết quả đầu ra.Cách nhận ID chính xác của bộ điều hợp AutoCompleteTextView

Tôi muốn đặt HashMap với id => cặp tên vào AutoCompleteTextView và nhận id của mục được nhấp. Khi tôi nhấp vào đầu ra bộ lọc được lọc tự động hoàn thành, tôi muốn điền một danh sách bên dưới hộp tự động hoàn thành, mà tôi cũng đã quản lý để hoạt động.

Xong cho đến nay:

  • autocomplete hoạt động tốt cho đơn giản ArrayList, tất cả dữ liệu đã lọc đúng
  • onItemClick kiện cháy đúng cách sau khi nhấp chuột
  • parent.getItemAtPosition(position) lợi nhuận đúng String đại diện của mặt hàng đó nhấp

Đêm trước nt onItemClick(AdapterView parent, View v, int position, long id) không hoạt động như tôi muốn. Làm cách nào tôi có thể tìm ra vị trí mảng chưa được lọc của mục được nhấp? Vị trí của một lọc là một trong những Tôi không quan tâm đến

câu hỏi tiếp theo:.

  • Làm thế nào để xử lý HashMaps hoặc Collections trong AutoCompleteTextView
  • Làm thế nào để có được quyền itemId trong onItemClick kiện

Tôi đã nghiên cứu rất sâu về vấn đề này, nhưng không tìm thấy bất kỳ thông tin giá trị nào có thể trả lời câu hỏi của tôi.

+0

Xin vui lòng giúp tôi bạn bè – sarath

+0

bạn Hải, tôi đã cố gắng để giải quyết việc này nhưng không thể ... Tôi wonder.Why không có giải pháp từ hổ android ??? –

Trả lời

13

Sự kiện onItemClick (AdapterView parent, View v, int position, long id) không hoạt động như tôi muốn.

Đây là tình huống bình thường khi lọc bộ điều hợp. Mặc dù bộ điều hợp giữ tham chiếu đến dữ liệu ban đầu chưa được lọc từ quan điểm của nó nhưng nó có một bộ dữ liệu duy nhất dựa trên dữ liệu đó (bất kể là dữ liệu ban đầu hay kết quả từ hoạt động lọc). Nhưng điều này không nên gây ra bất kỳ vấn đề gì. Với bộ điều hợp sdk mặc định (hoặc với một phân lớp), trong số onItemClick() bạn nhận được position cho danh sách hiện tại mà bộ điều hợp dựa vào. Sau đó, bạn có thể sử dụng getItem() để nhận mục dữ liệu cho số position đó (một lần nữa không quan trọng nếu ban đầu hoặc được lọc).

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

này sẽ làm việc cho các danh sách và Maps (giả định rằng bạn sử dụng SimpleAdapter). Và đối với số Maps bạn luôn có tùy chọn thêm khóa bổ sung để đặt vị trí chưa được lọc trong danh sách ban đầu.

Nếu bạn sử dụng bộ điều hợp riêng của mình cùng với AutoCompleteTextView, bạn có thể làm cho onItemClick() cung cấp cho bạn quyền id (vị trí tuy nhiên bạn không thể thay đổi).

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


} 

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

} 

Nếu bạn cũng thực hiện các lớp Filter cho adapter sau đó bạn có thể nhận được các id từ đó mà không cần phải ghi đè lên lớp AutoCompleTextView.

1

Sử dụng phương pháp Luksprog, tôi đã thực hiện một số tương tự với 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

Thực hiện onItemClickListener cho AutoCompleteTextView, sau đó sử dụng indexOf trên danh sách của bạn để tìm chỉ mục của mục đã chọn.

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

Đầu tiên thêm dữ liệu của bạn vào ArrayList tùy chỉnh

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

Bây giờ để có được bất kỳ giá trị từ mô hình mà chúng tôi đã thêm ở trên. chúng ta có thể như thế này

searchOutletKey.setOnItemClickListener (new AdapterView.OnItemClickListener () { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       String txtOutletId = mOutletListSRModel.get(position).getId(); 
      } 
     }); 
Các vấn đề liên quan