获取ListView的孩子不在视图视图、孩子、ListView

2023-09-12 23:56:10 作者:\霸道的爱ャ

对于一个App我的工作,我试图让ListView的儿童。要做到这一点,我有以下一段code:

 查看的listItem = mListView.getChildAt(我);
 

不过,这仅适用于儿童是在视图。我也需要达到这个都没有考虑到孩子们。我将如何做到这一点?

编辑:

比较建议的方法来一个我已经用我发现下面的:

  RelativeLayout的listItem1 =(RelativeLayout的)mListView.getAdapter()getView(I,空,mListView)。
RelativeLayout的listItem2 =(RelativeLayout的)mListView.getChildAt(ⅰ);
Log.d(检查,listItem1:+ listItem1);
Log.d(检查,listItem2:+ listItem2);

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

listItem2指向在ListView,这是我想要的,只是它仅适用于那些在望查看实际视图。您可以从listItem1和listItem2不对应的日志文件中看到。

编辑2:

我想出了以下内容:

 的for(int i = 0; I< mListView.getCount();我++){
    RelativeLayout的的listItem =(RelativeLayout的)mListView.getAdapter()getView(ⅰ,mListView.getChildAt(i)中,mListView)。
}
 
winform中listview控件view视图从LargeIcon变成Details时,原来内容怎么不显示

这正确返回视图列表中的所有可见的物品。但是,它会返回一个不同的视图为那些不在视线。

修改3:

由于nfirex我有一个工作的答案。这将返回查看,即使他们不直接在视线:

 公开查看getViewByPosition(INT位置,ListView控件的ListView){
    最终诠释firstListItemPosition = listView.getFirstVisiblePosition();
    最终诠释lastListItemPosition = firstListItemPosition + listView.getChildCount() -  1;

    如果(位置< firstListItemPosition ||位置> lastListItemPosition){
        返回listView.getAdapter()getView(位置,listView.getChildAt(位置),ListView控件)。
    } 其他 {
        最终诠释childIndex =位置 -  firstListItemPosition;
        返回listView.getChildAt(childIndex);
    }
}
 

解决方案

您需要的方法Adapter.getView():

 最终视图中查看= mListView.getAdapter()getView(位置,空,mListView)。
 

更新:

您需要创建你的方法。事情是这样的:

 公开查看getViewByPosition(INT位置,ListView控件的ListView){
    最终诠释firstListItemPosition = listView.getFirstVisiblePosition();
    最终诠释lastListItemPosition = firstListItemPosition + listView.getChildCount() -  1;

    如果(位置< firstListItemPosition ||位置> lastListItemPosition){
        返回listView.getAdapter()getView(位置,空,ListView控件)。
    } 其他 {
        最终诠释childIndex =位置 -  firstListItemPosition;
        返回listView.getChildAt(childIndex);
    }
}
 

For an App I am working on, I'm trying to get the children of a ListView. To do this I have the following piece of code:

View listItem = mListView.getChildAt(i);

However, this only works for children that are in view. I need to also reach the children that are not in view. How would I do this?

EDIT:

Comparing the suggested methods to the one I was already using I find the following:

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

listItem2 points to the actual View in the ListView, which is what I want except that it only works for Views that are in sight. You can see from the log file that listItem1 and listItem2 don't correspond.

EDIT 2:

I came up with the following:

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

This returns the Views correctly for all visible items in the list. However, it returns a different View for the ones that aren't in sight.

EDIT 3:

Thanks to nfirex I have a working answer. This will return Views even if they're not directly in sight:

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

解决方案

You need method Adapter.getView():

final View view = mListView.getAdapter().getView(position, null, mListView);

UPDATE:

You need to create your method. Something like this:

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