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.
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
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