web-dev-qa-db-ja.com

Android:ListViewから子ビューにアクセスします

ListViewを使用して表示されたリスト内の1つの要素のピクセル位置を見つける必要があります。 TextView'sの1つを取得してからgetTop()を使用する必要があるようですが、ListViewの子ビューを取得する方法がわかりません。

更新:ViewGroupの場合、ListViewの子はリスト内のアイテムと1対1で対応していません。代わりに、ViewGroupの子は、現在表示されているビューのみに対応しています。したがって、getChildAt()ViewGroupの内部にあるインデックスで動作し、ListViewが使用するリスト内の位置とは必ずしも関係がありません。

107
lacker

参照: 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の子を反復処理しないことです。これにより、パフォーマンスが低下する可能性があります。

216
Joe

このコードは使いやすいです。

 View rowView = listView.getChildAt(viewIndex);//The item number in the List View
    if(rowView != null)
        {
           // Your code here
        }
17
Kalimah Apps

ListViewクラスのドキュメントをすばやく検索すると、ViewGroupから継承されたgetChildCount()およびgetChildAt()メソッドが見つかりました。これらを使用してそれらを反復処理できますか?よくわかりませんが、試してみる価値はあります。

それを見つけました ここ

6
Feet
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つのDrawablesを作成します。1つは透明で、もう1つは目的の色です。クリックされた位置(int position定義どおり)にフォーカスを要求し、その行の色を変更します。次に、親ListViewをウォークスルーし、それに応じて他のすべての行を変更します。これは、ユーザーがlistviewを複数回クリックしたときに考慮されます。これは、ListViewの各行のカスタムレイアウトを使用して行われます。 (非常にシンプルで、TextViewで新しいレイアウトファイルを作成するだけです。フォーカス可能またはクリック可能に設定しないでください!).

カスタムアダプターは不要-ArrayAdapterを使用

5
Wes
int position = 0;
listview.setItemChecked(position, true);
View wantedView = adapter.getView(position, null, listview);
4
Milaaaad