リストビューデータがフィルタリングされた後、lisviewからアイテムをクリックすると、間違った結果が得られます。リストビューがフィルタリングされると位置の値が変化することを理解しています。正しい位置の値を取得する方法がわかりません。
mListView.setAdapter(mAdapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, data));
mListView.setTextFilterEnabled(true);
setupSearchView();
mAdapter.setNotifyOnChange(true);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
getActivityMain().pushNextFragment(FragmentWebview.newInstance(bbcNewsList.get(position).link,"roundfeed",bbcNewsList.get(position).title,bbcNewsList.get(position).source,bbcNewsList.get(position).image));
System.out.println(" id " + id + " pos " + position);
}
});
カスタムアダプターを使用する必要がありますか?
外部リストをアダプターのリストと同期する方法がないため、現在のコードを理解することはできません...特にフィルタリングが含まれる場合はそうです。代わりにのデータ型を格納するカスタムアダプタが必要になりますbbcNewsList
。この答えのために、それList
がFoo
オブジェクトを格納しているとしましょう。あなたは次のようなことをしたいと思うでしょう:
List<Foo> bbcNewsList;
// Fill bbcNewsList with data
mAdapter = new MyCustomAdapter(getActivity(),bbcNewsList);
mListView.setAdapter(mAdapter);
//Continue instantiation as needed
ArrayAdapter
カスタムソリューション用にを拡張してみることができますが、それは問題になる可能性があります。まずgetView()
、カスタムFoo
オブジェクトの表示方法がわかるように、メソッドをオーバーライドする必要があります。それ以外の場合は、Foo
オブジェクトをに変換してString
表示します。画像のフィルタリングを使用すると、デフォルトのロジックに固執します。あなたの場合、はオブジェクトをにArrayAdapter
変換し、その結果に基づいてフィルタリングします。あなたはその振る舞いに問題がないかもしれません、そしてその場合、あなたはこのアプローチに問題がありません。ただし、その場で変更する予定がある場合は、フィルタリングにかなり厄介なバグがあることを警告します。Foo
String
ArrayAdapter
もう1つの方法は、独自のアダプターを最初から作成することです。別名、BaseAdapter
クラスの実装。それほど気が遠くなることはありませんが、Androidを学んだばかりの人や、アダプターが一般的にどのように機能するかわからない人にとっては、かなり難しい場合があります。このソリューションでは、すべてのフィルタリングコードも実装する必要があります。
最後に、3番目のオプションはサードパーティのライブラリを使用することです。AbsArrayAdapterクラスをお勧めします。ここでは基本的に最初のオプションで行うことを行いますが、Foo
オブジェクトをフィルタリングする方法を指定するオプションがあります。また、Androidのフィルタリングバグの影響も受けませんArrayAdapter
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加