109

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

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

4

6 に答える 6

216

参照: Android ListView: 表示可能なアイテムのデータ インデックスを取得 し、上記のフィートの回答の一部と組み合わせると、次のような結果が得られます。

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

于 2010-04-20T23:01:57.550 に答える
18

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

 View rowView = listView.getChildAt(viewIndex);//The item number in the List View
    if(rowView != null)
        {
           // Your code here
        }
于 2012-01-01T08:20:17.360 に答える
6

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

ここで見つけた

于 2008-11-02T23:04:55.310 に答える
5
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定義されている) にフォーカスをリクエストし、その行の色を変更します。次に、parentListViewをウォークスルーし、それに応じて他のすべての行を変更します。listviewこれは、ユーザーが複数回クリックした場合を考慮したものです。これは、 の各行のカスタム レイアウトで行われますListViewTextView(非常に簡単です。フォーカス可能またはクリック可能に設定しないで、新しいレイアウト ファイルを作成するだけです)。

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

于 2013-06-27T13:54:47.200 に答える
4
int position = 0;
listview.setItemChecked(position, true);
View wantedView = adapter.getView(position, null, listview);
于 2016-01-29T08:11:43.073 に答える
-9

これは、 ListView 内の要素の位置を知っていることを前提としています。

  View element = listView.getListAdapter().getView(position, null, null);

次に、 getLeft() および getTop() を呼び出して、画面上の要素を決定できるはずです。

于 2008-12-04T14:08:27.687 に答える