ListActivity からカスタム ListView をフィルタリングしようとしています。問題は、フィルターが実際に機能している間、ListView が正しく表示されないことです。
たとえば、それぞれ a、b、c、da、db で始まる 3 つの項目がある場合、e と入力すると、ListView が空であることが示されます。ただし、b を入力すると a が表示され、c を入力すると a が表示されます。d と入力すると、a、b と表示されます。何が間違っていたのか、その問題が発生するために何が欠けているのか、完全にはわかりません。位置がフィルターに渡されていないようですが、これを行うにはどうすればよいですか?
以下は私のArrayAdapterです:
private class SiteAdapter extends ArrayAdapter<Site> {
private ArrayList<Site> sites;
public SiteAdapter(Context context, int textViewResourceId, ArrayList<Site> sites) {
super(context, textViewResourceId, sites);
this.sites = sites;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.row, null);
}
Site s = this.sites.get(position);
if (s != null) {
TextView tt = (TextView) v.findViewById(R.id.toptext);
TextView bt = (TextView) v.findViewById(R.id.bottomtext);
TextView rt = (TextView) v.findViewById(R.id.statustext);
if (tt != null) {
tt.setText("sup2");
}
if (bt != null) {
bt.setText("sup");
}
if (rt != null) {
rt.setText("sup");
}
}
v.setOnClickListener(new OnItemClickListener(position));
return v;
}
private class OnItemClickListener implements OnClickListener{
private int mPosition;
OnItemClickListener(int position){
mPosition = position;
}
@Override
public void onClick(View arg0) {
//Log.v("MainActivity", sites.get(mPosition).getURL());
Intent intent = new Intent(getBaseContext(), Wee.class);
startActivityForResult(intent,1);
}
}
}
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) {
site_adapter.getFilter().filter(s);
}
};
@Override
protected void onDestroy() {
super.onDestroy();
filterText.removeTextChangedListener(filterTextWatcher);
}
私のオブジェクトクラスには次のものがあります:
@Override
public String toString() {
return new StringBuilder()
.append(this.SEARCHABLE).toString();
}
正しくフィルタリングするようになりましたが、テキスト ボックスを削除または空にするときに、フィルターがリストビューを元の状態に戻していません。ListView のカスタム フィルタリング ArrayAdapterから例を取得しました。
private class SiteFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
String prefix = constraint.toString().toLowerCase();
if (prefix == null || prefix.length() == 0) {
ArrayList<Site> list = new ArrayList<Site>(sites);
results.values = list;
results.count = list.size();
} else {
final ArrayList<Site> list = new ArrayList<Site>(sites);
final ArrayList<Site> nlist = new ArrayList<Site>();
int count = list.size();
for (int i = 0; i < count; i++) {
final Site pkmn = list.get(i);
final String value = pkmn.getFILTERABLETEXT().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) {
filtered_sites = (ArrayList<Site>) results.values;
clear();
int count = filtered_sites.size();
for (int i = 0; i < count; i++) {
Site pkmn = (Site) filtered_sites.get(i);
add(pkmn);
}
}
}
チャンドラのアドバイス:
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filtered_sites = (ArrayList<Site>) results.values;
site_adapter.notifyDataSetChanged();
clear();
int count = filtered_sites.size();
for (int i = 0; i < count; i++) {
Site pkmn = (Site) filtered_sites.get(i);
add(pkmn);
Log.d("OMGOMGOMG",pkmn.getURL());
}
site_adapter.notifyDataSetInvalidated();
}