Tôi có danh sách các quốc gia trong cơ sở dữ liệu. Tôi đã tạo một hoạt động quốc gia được chọn bao gồm hộp chỉnh sửa để lọc và danh sách hiển thị tên cờ và tên quốc gia.Đang cố lọc một ListView bằng runQueryOnBackgroundThread nhưng không có gì xảy ra - tôi đang thiếu gì?
Khi hoạt động bắt đầu danh sách hiển thị toàn bộ danh sách các quốc gia được sắp xếp theo thứ tự bảng chữ cái - hoạt động tốt. Khi khách hàng bắt đầu nhập vào hộp tìm kiếm, tôi muốn danh sách được lọc dựa trên cách nhập của họ. Truy vấn cơ sở dữ liệu của tôi trước đây đã làm việc trong một AutoCompleteView (tôi chỉ muốn chuyển sang một hộp văn bản và danh sách riêng biệt) vì vậy tôi biết truy vấn đầy đủ của mình và truy vấn ràng buộc của tôi đang hoạt động. Những gì tôi đã làm là thêm một TextWatcher vào EditText xem và mỗi khi văn bản được thay đổi tôi gọi SimpleCursorAdapter runQueryOnBackgroundThread của danh sách với các hộp văn bản chỉnh sửa như là ràng buộc. Vấn đề là danh sách không bao giờ được cập nhật. Tôi đã thiết lập các điểm ngắt trong trình gỡ lỗi và trình soạn thảo TextWatcher thực hiện lệnh gọi runQueryOnBackgroundThread và FilterQueryProvider của tôi được gọi với ràng buộc dự kiến. Truy vấn cơ sở dữ liệu hoạt động tốt và con trỏ được trả về.
Các bộ chuyển đổi con trỏ có một bộ cung cấp dịch vụ truy vấn lọc (và một chất kết dính view để hiển thị các cờ):
SimpleCursorAdapter adapter = new SimpleCursorAdapter (this,
R.layout.country_list_row, countryCursor, from, to);
adapter.setFilterQueryProvider (new CountryFilterProvider());
adapter.setViewBinder (new FlagViewBinder());
Các FitlerQueryProvider:
private final class CountryFilterProvider implements FilterQueryProvider {
@Override
public Cursor runQuery (CharSequence constraint) {
Cursor countryCursor = myDbHelper.getCountryList (constraint);
startManagingCursor (countryCursor);
return countryCursor;
}
}
Và EditText có TextWatcher:
myCountrySearchText = (EditText)findViewById (R.id.entry);
myCountrySearchText.setHint (R.string.country_hint);
myCountrySearchText.addTextChangedListener (new TextWatcher() {
@Override
public void afterTextChanged (Editable s) {
SimpleCursorAdapter filterAdapter = (SimpleCursorAdapter)myCountryList.getAdapter();
filterAdapter.runQueryOnBackgroundThread (s.toString());
}
@Override
public void onTextChanged (CharSequence s, int start, int before, int count) {
// no work to do
}
@Override
public void beforeTextChanged (CharSequence s, int start, int count, int after) {
// no work to do
}
});
Truy vấn cho cơ sở dữ liệu trông giống như sau:
public Cursor getCountryList (CharSequence constraint) {
if (constraint == null || constraint.length() == 0) {
// Return the full list of countries
return myDataBase.query (DATABASE_COUNTRY_TABLE,
new String[] { KEY_ROWID, KEY_COUNTRYNAME, KEY_COUNTRYCODE }, null, null, null,
null, KEY_COUNTRYNAME);
} else {
// Return a list of countries who's name contains the passed in constraint
return myDataBase.query (DATABASE_COUNTRY_TABLE,
new String[] { KEY_ROWID, KEY_COUNTRYNAME, KEY_COUNTRYCODE },
"Country like '%" + constraint.toString() + "%'", null, null, null,
"CASE WHEN Country like '" + constraint.toString() +
"%' THEN 0 ELSE 1 END, Country");
}
}
Dường như có liên kết bị thiếu ở đâu đó. Bất kỳ trợ giúp sẽ được đánh giá cao.
Cảm ơn,
Ian
Tại sao bạn muốn sử dụng TextWatcher w/EditText thay vì một AutoCompleteTextView? –
Điều gì xảy ra nếu bạn muốn đưa ra một tùy chọn để cho phép người dùng cuộn qua một ListView cũng như lọc ListView. Theo hiểu biết của tôi, AutoCompleteTextView sẽ không cho phép bạn có một listView riêng biệt. – rohitmishra