我有ListView
从" rowlayout"中获取每个项目的布局。
我想在我的主要活动中对rowlayout中的一个按钮执行某些操作,如何获取对它的引用findviewbyid
不起作用。
我想我基本上不理解如何在自定义布局中获取对视图的引用的一般概念 - 除非从ListView
获取视图是不同的。有人可以帮忙吗?谢谢。
答案 0 :(得分:1)
ListView
是ViewGroup
,所以你可以迭代它的孩子:
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()
。