カスタム アダプタを使用してリストを検索する EditText コンポーネントがあります。フィルタリングされたビューが画面に残ることを除いて、正常に機能します。ユーザーが編集ボックス内のすべてのテキストを削除した場合、完全なリストが画面に戻るようにします。
私は3つのアプローチを試しました:
アダプタのフィルタ クラスに条件を設定しました。FilterResults
notifyDataSetChanged();
関数に配置すると、プログラムがクラッシュします。アクティビティで EditTtext ボックスが空かどうかを検出し、 を呼び出し
notifyDataSetChanged();
ます。System.out.println()
コンソールにテキストが表示されるため、条件は機能します。ただし、listView には影響しません。フィルタリングされたテキストのみが画面に残ります。に配置
notifyDataSetChanged();
しOnTextChanged()
ます。これは、リストビューのリセットにも影響しません。
EditText Box が空のときにリストビューをリセットするにはどうすればよいですか?
アクティビティからのコード:
// OnCreate で
if (searchBox.toString().equals("")){
objAdapter.notifyDataSetChanged();
}
searchBox.addTextChangedListener(new TextWatcher(){
@Override
public void afterTextChanged(Editable arg0) {
// Do nothing
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// Do nothing
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
objAdapter.getFilter().filter(s);
if (s.toString().equals("")){
// objAdapter.notifyDataSetChanged(); fails here
}
}
}
});
アダプターからのコード。
public class NewsRowAdapter extends ArrayAdapter<Item> {
//.... code
private class ListFilter extends Filter
{
@Override
protected FilterResults performFiltering(CharSequence constraint)
{
FilterResults results = new FilterResults();
String prefix = constraint.toString().toLowerCase();
if (prefix == null || prefix.length() == 0)
{
System.out.println("editText is empty");
// notifyDataSetChanged(); no effect
ArrayList<Item> list = new ArrayList<Item>(original);
results.values = list;
results.count = list.size();
}
else
{
final ArrayList<Item> list = original;
int count = list.size();
final ArrayList<Item> nlist = new ArrayList<Item>(count);
for (int i=0; i<count; i++)
{
final Item pkmn = list.get(i);
final String value = pkmn.getName().toLowerCase();
if (value.startsWith(prefix))
{
nlist.add(pkmn);
}
}
results.values = nlist;
results.count = nlist.size();
}
return results;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
fitems = (ArrayList<Item>)results.values;
clear();
int count = fitems.size();
for (int i=0; i<count; i++)
{
Item pkmn = (Item)fitems.get(i);
add(pkmn);
}
if (fitems.size() > 0){
notifyDataSetChanged();
} else{
notifyDataSetInvalidated();
}
}
}