获取不在视图中的ListView子项

Zer*_*ero 18 android listview children

对于我正在处理的应用程序,我正在尝试获取ListView的子项.为此,我有以下代码:

View listItem = mListView.getChildAt(i);
Run Code Online (Sandbox Code Playgroud)

但是,这仅适用于视野中的儿童.我还要接触那些看不见的孩子.我该怎么做?

编辑:

将建议的方法与我已使用的方法进行比较,我发现以下内容:

RelativeLayout listItem1 = (RelativeLayout) mListView.getAdapter().getView(i, null, mListView);
RelativeLayout listItem2 = (RelativeLayout) mListView.getChildAt(i);
Log.d("Checks", "listItem1: " + listItem1);
Log.d("Checks", "listItem2: " + listItem2);

08-27 14:16:56.628: D/Checks(15025): listItem1: android.widget.RelativeLayout@2c5f2920
08-27 14:16:56.628: D/Checks(15025): listItem2: android.widget.RelativeLayout@2c06d938
08-27 14:16:56.628: D/Checks(15025): listItem1: android.widget.RelativeLayout@2c72dfb0
08-27 14:16:56.628: D/Checks(15025): listItem2: android.widget.RelativeLayout@2bfabe50
08-27 14:16:56.638: D/Checks(15025): listItem1: android.widget.RelativeLayout@2c730c18
08-27 14:16:56.638: D/Checks(15025): listItem2: android.widget.RelativeLayout@2c0d3e38
08-27 14:16:56.638: D/Checks(15025): listItem1: android.widget.RelativeLayout@2c12ebc0
08-27 14:16:56.638: D/Checks(15025): listItem2: android.widget.RelativeLayout@2bddbf70
08-27 14:16:56.648: D/Checks(15025): listItem1: android.widget.RelativeLayout@2c131828
08-27 14:16:56.648: D/Checks(15025): listItem2: android.widget.RelativeLayout@2bdf3270
08-27 14:16:56.648: D/Checks(15025): listItem1: android.widget.RelativeLayout@2c140de0
08-27 14:16:56.648: D/Checks(15025): listItem2: android.widget.RelativeLayout@2c0c8d30
Run Code Online (Sandbox Code Playgroud)

listItem2指向ListView中的实际View,这是我想要的,除了它只适用于可见的视图.您可以从日志文件中看到listItem1和listItem2不对应.

编辑2:

我想出了以下内容:

for (int i = 0; i < mListView.getCount(); i++) {
    RelativeLayout listItem = (RelativeLayout) mListView.getAdapter().getView(i, mListView.getChildAt(i), mListView);
}
Run Code Online (Sandbox Code Playgroud)

这将正确返回列表中所有可见项的视图.但是,它会为不可见的视图返回不同的视图.

编辑3:

感谢nfirex,我有一个合适的答案.这将返回视图,即使它们不是直接在视线中:

public View getViewByPosition(int position, ListView listView) {
    final int firstListItemPosition = listView.getFirstVisiblePosition();
    final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;

    if (position < firstListItemPosition || position > lastListItemPosition ) {
        return listView.getAdapter().getView(position, listView.getChildAt(position), listView);
    } else {
        final int childIndex = position - firstListItemPosition;
        return listView.getChildAt(childIndex);
    }
}
Run Code Online (Sandbox Code Playgroud)

nfi*_*rex 35

你需要方法Adapter.getView():

final View view = mListView.getAdapter().getView(position, null, mListView);
Run Code Online (Sandbox Code Playgroud)

更新:

您需要创建您的方法.像这样的东西:

public View getViewByPosition(int position, ListView listView) {
    final int firstListItemPosition = listView.getFirstVisiblePosition();
    final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;

    if (position < firstListItemPosition || position > lastListItemPosition ) {
        return listView.getAdapter().getView(position, null, listView);
    } else {
        final int childIndex = position - firstListItemPosition;
        return listView.getChildAt(childIndex);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这确实会返回一个视图.但是,我认为它会返回一个新视图而不是我想要的实际视图. (2认同)