Android - 如何在自定义布局中获取对视图的引用?

时间:2015-04-22 02:22:51

标签: java android layout android-listview

我有ListView从" rowlayout"中获取每个项目的布局。

我想在我的主要活动中对rowlayout中的一个按钮执行某些操作,如何获取对它的引用findviewbyid不起作用。

我想我基本上不理解如何在自定义布局中获取对视图的引用的一般概念 - 除非从ListView获取视图是不同的。有人可以帮忙吗?谢谢。

4 个答案:

答案 0 :(得分:1)

ListViewViewGroup,所以你可以迭代它的孩子:

int n = getChildCount();
for (int i = 0; i < n; i++) {
    doSomethingToView(getChildAt(i));
}

但是,你必须小心。 ListView非常特殊,只有您可能期望的子集子集。它只保存(粗略地)对当前可见的儿童的引用,并在它们消失时重新使用它们。

您可能会考虑更改底层适配器而不是通知ListView其适配器已更改,因此需要重新绘制子项。或者,您可以让ListView的孩子直接听取应该更改它的事件,然后自行调整。

答案 1 :(得分:1)

如果要在适配器的getView方法中为自定义布局充气,可以获得这样的视图

LayoutInflater inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View rowView = inflater.inflate(R.layout.your_custom_layout, parent, false);

TextView tv = (TextView) rowView.findViewById(R.id.your_tv_id);

答案 2 :(得分:0)

如果您以partial refresh principle的方式实施ListView,则可以使用ViewHolder,就像这样:

private void refreshPartially(int position){
    int firstVisiblePosition = listview.getFirstVisiblePosition();
    int lastVisiblePosition = listview.getLastVisiblePosition();
    if(position>=firstVisiblePosition && position<=lastVisiblePosition){
        View view = listview.getChildAt(position - firstVisiblePosition);
        if(view.getTag() instanceof ViewHolder){
            ViewHolder vh = (ViewHolder)view.getTag();
            //holder.play.setBackgroundResource(resId);//Do something here.
            ...
        }
    }
}

答案 3 :(得分:0)

您可以使用此android - listview get item view by position的答案来查看某个位置的子视图,然后在该子视图上调用findViewById()