カスタム配列アダプター上に構築された ListView にフィルターを実装しました。リストには、有名人の名前とその有名人の写真が表示されます。
public class Celebrities extends ListActivity {
private EditText filterText = null;
ArrayAdapter<CelebrityEntry> adapter = null;
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) {
adapter.getFilter().filter(s);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_celebrity);
//disables the up button
getActionBar().setDisplayHomeAsUpEnabled(true);
filterText = (EditText) findViewById(R.id.search_box);
filterText.addTextChangedListener(filterTextWatcher);
adapter = new CelebrityEntryAdapter(this, getModel());
setListAdapter(adapter);
}
toString()
そして、CelebrityEntry.java のメソッドをオーバーライドしました。
public final class CelebrityEntry {
private String name;
private int pic;
public CelebrityEntry(String name, int pic) {
this.name = name;
this.pic = pic;
}
/**
* @return name of celebrity
*/
public String getName() {
return name;
}
/**
* override the toString function so filter will work
*/
public String toString() {
return name;
}
/**
* @return picture of celebrity
*/
public int getPic() {
return pic;
}
}
ただし、アプリを起動してフィルタリングを開始すると、各リスト エントリには適切な画像が表示されますが、名前は元のリストにすぎず、フィルタを実際に満たした有名人の数に切り捨てられます。Kirsten Dunst がリストの最初のエントリで、Adam Savage が 2 番目のエントリであるとします。Adam Savage をフィルターすると、彼の写真が表示されますが、この 2 つの情報は 1 つのオブジェクトの要素であるにもかかわらず、名前は Kirsten Dunst のままです。
明らかに、これは望ましい結果ではありません。考え?