カスタムアダプター(ベースアダプター)のリストビューがあります。位置ごとにリストビューからビューを取得したい。 mListView.getChildAt(position)
を試しましたが、機能していません。位置ごとにアイテムビューを取得するにはどうすればよいですか?
これを使って :
public View getViewByPosition(int pos, ListView listView) {
final int firstListItemPosition = listView.getFirstVisiblePosition();
final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;
if (pos < firstListItemPosition || pos > lastListItemPosition ) {
return listView.getAdapter().getView(pos, null, listView);
} else {
final int childIndex = pos - firstListItemPosition;
return listView.getChildAt(childIndex);
}
}
ListViewの行ビューは再利用できるため、ListViewから表示できるビューのみを取得できます。 mListView.getChildAt(0)
を使用すると、最初に表示されるビューが表示されます。このビューは、位置mListView.getFirstVisiblePosition()
のアダプターからのアイテムに関連付けられています。
ListViewが描画された後に行ビューの外観/何でも変更する好ましい方法は、ListViewが描画するデータ(アダプタに渡されるオブジェクトの配列)の何かを変更し、getView()でそれを確認することです。関数を呼び出して、ListViewを再描画します
notifyDataSetChanged();
編集:これを行う方法はありますが、これを行う必要がある場合は、何か間違ったことをしている可能性があります。私が考えることができるエッジのケースはほとんどありませんが、一般的にnotifyDataSetChanged()
およびその他の組み込みのメカニズムを使用する方法があります。
編集2:人々が犯すよくある間違いの1つは、この投稿へのコメントの1つにあるように、ユーザーがListViewで行をクリック/選択することに応答する独自の方法を考え出すことです。これを行う既存の方法があります。方法は次のとおりです。
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
/* Parameters
parent: The AdapterView where the click happened.
view: The view within the AdapterView that was clicked (this will be a view provided by the adapter)
position: The position of the view in the adapter.
id: The row id of the item that was clicked. */
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//your code here
}
});
ListView には多くの組み込み機能があり、簡単な場合に車輪を再発明する必要はありません。 ListViewは AdapterView を拡張するため、上記の例のように OnItemClickListener などの同じリスナーを設定できます。
workignHoursListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent,View view, int position, long id) {
viewtype yourview=yourListViewId.getChildAt(position).findViewById(R.id.viewid);
}
});