回答:
参照:Android ListView:表示されているアイテムのデータインデックスを取得し 、上記のFeetの回答の一部と組み合わせると、次のような結果が得られます。
int wantedPosition = 10; // Whatever position you're looking for
int firstPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount(); // This is the same as child #0
int wantedChild = wantedPosition - firstPosition;
// Say, first visible position is 8, you want position 10, wantedChild will now be 2
// So that means your view is child #2 in the ViewGroup:
if (wantedChild < 0 || wantedChild >= listView.getChildCount()) {
Log.w(TAG, "Unable to get view for desired position, because it's not being displayed on screen.");
return;
}
// Could also check if wantedPosition is between listView.getFirstVisiblePosition() and listView.getLastVisiblePosition() instead.
View wantedView = listView.getChildAt(wantedChild);
利点は、ListViewの子を繰り返し処理しないため、パフォーマンスが低下する可能性があることです。
ListView
すでに古いリサイクル後の周りの子ビューを「移動」処理しているconvertView
あなたはので、など、Sをできることが保証されListView.getChildAt(0)
ている実際には、アダプタからの最初の添付眺め。完全に表示されない場合があります(またListView
、ビューをリサイクルする前の「表示」のしきい値によっては、「スクロールされて表示されない」と見なされる場合もあります)
このコードは使いやすいです:
View rowView = listView.getChildAt(viewIndex);//The item number in the List View
if(rowView != null)
{
// Your code here
}
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, final View view, int position, long id) {
View v;
int count = parent.getChildCount();
v = parent.getChildAt(position);
parent.requestChildFocus(v, view);
v.setBackground(res.getDrawable(R.drawable.transparent_button));
for (int i = 0; i < count; i++) {
if (i != position) {
v = parent.getChildAt(i);
v.setBackground(res.getDrawable(R.drawable.not_clicked));
}
}
}
});
基本的に、2つのDrawableを作成します-1つは透明で、もう1つは目的の色です。クリックした位置(int position
定義どおり)にフォーカスを要求し、その行の色を変更します。次に、親をウォークスルーし、ListView
それに応じて他のすべての行を変更します。これは、ユーザーがlistview
複数回クリックしたときに発生します。これは、の各行のカスタムレイアウトで行われListView
ます。(非常に簡単です。新しいレイアウトファイルを作成するには、TextView
フォーカス可能またはクリック可能に設定しないでください。)
カスタムアダプターは不要-使用 ArrayAdapter
これは、ListViewでの要素の位置がわかっていることを前提としています。
View element = listView.getListAdapter().getView(position, null, null);
次に、getLeft()とgetTop()を呼び出して、画面上の要素を特定できるはずです。
getView()
リストを生成するときに、ListViewによって内部的に呼び出されます。あなたはいけません呼び出すと、リスト内のその位置でのビューを取得するためにそれを使用getView()
するためにnullを指定してconvertView
、アダプタが(すでに表示されているビューを取得しません)アダプタのレイアウトリソースから新しいビューを膨らませる原因となります。
firstPosition
べきであるint firstPosition = listView.getFirstVisiblePosition() - listView.getHeaderViewsCount();
。この問題を解決します。