web-dev-qa-db-ja.com

android-リストビューは位置によってアイテムビューを取得します

カスタムアダプター(ベースアダプター)のリストビューがあります。位置ごとにリストビューからビューを取得したい。 mListView.getChildAt(position)を試しましたが、機能していません。位置ごとにアイテムビューを取得するにはどうすればよいですか?

68
alashow

これを使って :

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);
    }
}
245
VVB

ListViewの行ビューは再利用できるため、ListViewから表示できるビューのみを取得できます。 mListView.getChildAt(0)を使用すると、最初に表示されるビューが表示されます。このビューは、位置mListView.getFirstVisiblePosition()のアダプターからのアイテムに関連付けられています。

13
Matt Twig

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 などの同じリスナーを設定できます。

4
C0D3LIC1OU5
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);
    }
});
1
Mohamed Ayed