#android #android-listview
#Android #android-listview
Вопрос:
У меня есть ListView, и идея заключается в том, что при вводе пользователем, чем только строки, представленные пользователю, будут начинаться с того, что написал пользователь.
Если бы на каждом устройстве Android была установлена физическая клавиатура, я мог бы добиться этого с помощью этого простого кода :
ListView lv = getListView();
lv.setTextFilterEnabled(true);
но, как вы, наверное, знаете, некоторые устройства, такие как Samsung galaxi S, не имеют физической клавиатуры.
Что я сделал, так это создал простой файл макета, содержащий только EditText, и я использовал метод addHeaderView, поэтому теперь у меня есть EditText (пользователь может ввести его) над списком. Я хочу использовать addTextChangedListener, чтобы я мог реагировать на то, что вводит пользователь.
Вопрос в том, как изменить отображение, чтобы оно отображало только нужные мне строки (у меня нет проблем с поиском этих строк, проблема в том, как обновить текущий dispay) Или, если есть другое решение для преодоления того факта, что на некоторых устройствах нет физической клавиатуры, это такжеотлично.
Комментарии:
1. Что вы подразумеваете под «обновлением текущего распределения»?
2. @Paresh Mayani — чтобы изменить, какие строки видит пользователь. Идея состоит в том, чтобы делать то, что setTextFilterEnabled(true) делает на устройстве с физической клавиатурой, когда пользователь что-то вводит
Ответ №1:
Я уверен, что вы хотите реализовать что-то вроде: ListView должен обновляться в соответствии со значением, введенным пользователем, если это так, то вот пример: Android ListView с элементами сортировки в поле поиска
Комментарии:
1. У меня небольшая проблема с кодом: когда я ввожу один символ в EditText, он работает нормально, когда я пытаюсь ввести другой символ, скажем, «a», а затем «b», чем я вижу, что b записан (выглядит как тост), а строки, начинающиеся с «ab», не отображаются.показано.
Ответ №2:
Одним из решений может быть фильтрация отображаемого списка в AsyncTask, а затем обновление списка в вашем адаптере. Затем с помощью notifyDataSetChanged список обновляется, чтобы показывать только нужные вам элементы. Возможно, это не очень элегантное решение, но оно сработало для меня.
РЕДАКТИРОВАТЬ: это должно сработать
void setTextChangedListenerToSearchBox(EditText etFilter) {
if (etFilter == null)
return;
etFilter.addTextChangedListener(new TextWatcher() {
public void afterTextChanged(Editable s) {
// nothing done here
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// nothing done here
}
public void onTextChanged(CharSequence s, int start, int before,
int count) {
if (s.toString() != null) {
searchupdate(s.toString());
}
}
});
}
void searchupdate(String s)
{
final List<String> currentItems = new ArrayList<String>(yourCurrentlyDisplayedItems);
(new AsyncTask<String,Void,List<String>>() {
@Override
protected List<String> doInBackground(String... params)
{
List<String> listitems = new ArrayList<String>();
for(String item : currentItems) {
if(item.contains(params[0])) {
listitems.add(item);
}
}
return listitems;
}
@Override
protected void onPostExecute(List<String> result)
{
adapter.clear();
adapter.addAll(result);
adapter.notifyDataSetChanged();
}
}).execute(s);
}