2010-04-20 10 views
7

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.AutoCompleteTextView onItemNhấp vào vị trí mục hoặc id bằng cách sử dụng HashMap

Tôi muốn đặt một số HashMap với id => tên cặp vào số 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 ArrayList đơn giản, tất cả dữ liệu được lọc đúng
  • onItemClick kiện cháy đúng cách sau khi nhấp
  • parent.getItemAtPosition (vị trí) trả về chuỗi đại diện chính xác của các nhấp mục

Sự kiện 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 Bộ sưu tập trong AutoCompleteTextView
  • Làm thế nào để có được những ItemID đúng trong trường hợp onItemClick

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

Bạn đang triển khai 'Có thể lọc' và sử dụng các phương pháp 'LọC# performFiltering()' và 'LọC# publishResults()'? – Joe

+0

Tôi cũng phải đối mặt với cùng một vấn đề .... xin vui lòng cho một giải pháp bạn bè – sarath

Trả lời

-1

Làm thế nào để xử lý HashMaps hoặc Bộ sưu tập trong AutoCompleteTextView

Bạn có thể đặt bộ chuyển đổi tùy chỉnh của riêng bạn. Trong bộ điều hợp, tùy thuộc vào bạn nơi bạn lấy dữ liệu của mình đến một vị trí nhất định.

Làm thế nào để có được những ItemID đúng trong trường hợp onItemClick

Trong bộ chuyển đổi tùy chỉnh của bạn, bạn xác định một bộ lọc, và lọc mà bộ các hạng mục đề nghị. Bạn có hai danh sách khác nhau, một danh sách có giá trị gốc và một danh sách khác có các mục được lọc. Tôi có nghĩa là một cái gì đó như thế này.

private class AutoCompleteItemAdapter extends ArrayAdapter<YourItemClass> implements Filterable { 

    private NameFilter  mFilter; 
    List<YourItemClass> suggestions; 
    List<YourItemClass> mOriginalValues; 

    public AutoCompleteItemAdapter(Context context, int resource, List<YourItemClass> suggestions) { 
     super(context, resource, suggestions); 
     this.suggestions = suggestions; 
     this.mOriginalValues = suggestions; 
    } 

    public void updateData(List<YourItemClass> suggestions) { 
       mLock.lock(); 
       try{ 
        this.suggestions = suggestions; 
         this.mOriginalValues = suggestions; 
      finally{ 
       mLock.unlock(); 
      } 
     } 

    @Override 
    public int getCount() { 
     mLock.lock(); 
     try { 
      return suggestions.size(); 
     } finally { 
      mLock.unlock(); 
     } 
    } 

    @Override 
    public YourItemClass getItem(int position) { 
     return mOriginalValues.get(position); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // draw your item here... 
    } 

    @Override 
    public Filter getFilter() { 
     if (mFilter == null) { 
      mFilter = new NameFilter(); 
     } 
     return mFilter; 
    } 

    private class NameFilter extends Filter { 
     @Override 
     protected FilterResults performFiltering(CharSequence prefix) { 
      FilterResults results = new FilterResults(); 

      if (mOriginalValues == null) { 
       mLock.lock(); 
       try { 
        mOriginalValues = new ArrayList<YourItemClass>(suggestions); 
       } finally { 
        mLock.unlock(); 
       } 
      } 

      if (prefix == null || prefix.length() == 0) { 
       mLock.lock(); 
       try { 
        ArrayList<YourItemClass> list = new ArrayList<YourItemClass>(mOriginalValues); 
        results.values = list; 
        results.count = list.size(); 
       } finally { 
        mLock.unlock(); 
       } 
      } else { 
       String prefixString = prefix.toString().toLowerCase(); 

       final List<YourItemClass> values = mOriginalValues; 
       final int count = values.size(); 

       final ArrayList<YourItemClass> newValues = new ArrayList<YourItemClass>(count); 

       //    FILTERING 
       // 
        // add your hits to the newValues collection 
       // 
       // 
       results.values = newValues; 
       results.count = newValues.size(); 
      } 
      return results; 
     } 


     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      mLock.lock(); 
      try { 
       if (results == null || results.values == null) return; 
       suggestions = new ArrayList<YourItemClass>(); 
       suggestions = (List<YourItemClass>) results.values; 
       if (results.count > 0) { 
        notifyDataSetChanged(); 
       } else { 
        notifyDataSetInvalidated(); 
       } 
      } finally { 
       mLock.unlock(); 
      } 
     } 
    } 
} 

Bây giờ điều này có thể gây một số vấn đề đồng thời, như chúng ta tham khảo, adapter có thể yêu cầu kích thước của danh sách, và một giá trị lớn hơn đi ra ngoài, mà có thể gây ra vấn đề trong hàm getView. (fi .: Cố gắng vẽ 5 phần tử với dữ liệu cơ bản chỉ có 4, bởi vì chúng tôi đã lọc khác) Đây là cách chúng tôi sử dụng AutoCompleteTextView của chúng tôi, và cho đến nay nó hoạt động tuyệt vời, không có vấn đề gì. Tôi chỉ đề cập rằng tôi vẫn còn quan tâm, và tôi có cảm giác mơ hồ này rằng có một giải pháp tốt hơn cho việc này.

Trong trình nghe onClick, bạn sử dụng giá trị được trả về (từ danh sách được lọc) làm khóa trong bản đồ của bạn và nhận giá trị được liên kết.Bạn có thể nghĩ danh sách của mình sử dụng chỉ mục cho số HashMap. Sau đó, bạn có thể sử dụng Map để vẽ mục của bạn hoặc để lấy dữ liệu của riêng bạn.

+0

-1: Điều này không trả lời câu hỏi của OP. '... Bạn sử dụng giá trị trả về (từ danh sách được lọc) làm khóa trong bản đồ của bạn ...' - Không, không, không. Giá trị * * từ danh sách được lọc không phải là * khóa *. –