Как отобразить "нет результата" в фильтруемом ListView?
у меня есть ListView
и EditText
. Я реализую addTextChangedListener
on EditText
to фильтр the ListView
содержание.
leftList.setTextFilterEnabled(true);
et_search.addTextChangedListener(filterTextWatcher);
а то TextWatcher
- это:
private TextWatcher filterTextWatcher = new TextWatcher() {
public void afterTextChanged(Editable s) {
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
}
public void onTextChanged(CharSequence s, int start, int before,
int count) {
if (watcherAdapter==null) {
return;
}
watcherAdapter.getFilter().filter(s);
Log.e(TAG, "OnTextChange: " + s + " start: " + start +
" before: " + before + " count: " + count + " adapter: " +
watcherAdapter.getCount());
}
};
состояние:
- у меня есть 10 пунктов в
ListView
.
вопрос:
- когда я впервые набираю первый символ, почему
watcherAdapter.getCount()
возвращает10
(как начальный) вListVie
w вместо возвращенного количества результатов фильтра? ThewatcherAdapter.getCount(
) кажется, a-click поздно для отображаемого результата вListView
. - как я добиваюсь, чтобы показать
"No Result"
наListView
когда нет результатов матча, как я печатаю наEditText
?
5 ответов
это чище, чтобы добавить TextView в макет, выше или ниже списка, где вы показываете сообщение:
<TextView
android:id="@+id/noResultsFoundView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="No result"
android:visibility="gone"
/>
когда у вас есть результаты, вы устанавливаете видимость в GONE. Когда у вас нет результатов, вы устанавливаете его на видимый.
чтобы прослушать это, вы можете реализовать пользовательский фильтр или, по крайней мере, переопределить метод
publishResults(CharSequence constraint, FilterResults results)
из фильтра, где в параметре FilterResults передается правильный обновленный счетчик.
в publishResults вызов метода из действия для обновления видимости noResultsFoundView. Как вы получаете доступ к активности, зависит от того, где находится ваш фильтр. Если он находится во внутреннем классе деятельности, то это легко. В противном случае вы, например, передаете действие как параметр для создания экземпляра адаптера и сохраняете его как переменную intance.
конечно, можно не показывать результат в фильтруемом списке. Пожалуйста, обратитесь к приведенному ниже коду
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.home, menu);
MenuItem searchItem = menu.findItem(R.id.menu_search);
final AppCompatEditText searchView = (AppCompatEditText) MenuItemCompat.getActionView(searchItem);
if (searchView != null) {
searchView.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
if(mAdapter==null)
return;
mAdapter.getFilter().filter(arg0.toString());
if(mAdapter.getItemCount()<1){
listView.setVisibility(View.GONE);
txtEmptyList.setVisibility(View.VISIBLE);
}else{
listView.setVisibility(View.VISIBLE);
txtEmptyList.setVisibility(View.GONE);
}
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1,
int arg2, int arg3) {
}
@Override
public void afterTextChanged(Editable arg0) {
}
});
}
MenuItemCompat.setOnActionExpandListener(searchItem, this);
MenuItemCompat.setActionView(searchItem, searchView);
super.onCreateOptionsMenu(menu, inflater);
}
if(!fillMaps.isEmpty())
{
SimpleAdapter adapter = new SimpleAdapter(
WorldClockActivity.this, fillMaps, R.layout.grid_item,
from, to);
lv1.setAdapter(adapter);
}
else
{ String[] emptyList = new String[] {"No record found"};
lv1.setAdapter(new ArrayAdapter<String>(WorldClockActivity.this,R.layout.list_item, emptyList));
}
вы должны использовать два адаптера для этого в приведенном выше коде я использую два адаптера, первый из которых установлен, когда мы нашли элемент на карте, если карта пуста, то вы должны добавить еще один адаптер, я поставил его в другое состояние.Я сделал это, и все идет хорошо. Надеюсь, ты нашел решение.
единственное решение, которое я использую, это сделать мой пользовательский фильтр поиска....Разделить слова, разбивает их, и в случае соответствия поставить его на массив в качестве адаптера в списке. И он работает так, как я этого хочу
проще и чище, что другие ответы: посмотри ListActivity
с пустым View
:
http://developer.android.com/reference/android/app/ListActivity.html
Читайте также: