有没有办法获取视图膨胀的布局的资源ID(如R.layout.viewtoInflate)?
我正在尝试实现一个列表视图,该列表视图对列表项使用2个自定义布局。使用的项目布局基于用于填充列表视图的对象中的字段。
我在自定义适配器中缺少的是一种了解我在getView()中获得的'convertView'被夸大的资源的方法。如果我能得到这些信息,我可以比较并确定我是否可以重新使用转换视图,或者我是否必须用当前项目的相应布局替换它。
理想情况下,它会是这样的:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
JSONObject currItem = mItems.getJSONObject(position);
int layoutType;
if (currItem.getBoolean("alternate"))
layoutType = R.layout.list_item_b;
else
layoutType = R.layout.list_item_a;
if (convertView == null || <convertView.resourceID> != layoutType ) {
convertView = inflater.inflate(layoutType, null);
//Finish setting up new View and its holder
}
else {
//Get view holder for view reuse
}
//populate view with the required content
return convertView;
}
最糟糕的是,我根本不能重复使用视图,只是每次都需要扩展我需要的布局,但这看起来非常浪费。
答案 0 :(得分:5)
有一种使用多种布局的官方方法,只需覆盖getViewTypeCount()
和getItemViewType()
即可。这些方法通知适配器期望多个布局,convertView
将始终是适当的布局(因此不需要检查资源ID。)请参阅this example以获取一些示例代码。
但是如果你想找出哪个布局,只需检查一个独特的特征。例如,您可以在仅存在于一个布局中的视图上使用findViewById()
,然后检查它是否返回null
。
答案 1 :(得分:3)
列表视图支持多种布局 - 您需要返回getViewTypeCount()
中使用的布局数量,并更正getItemViewType()
中行的布局类型。
如果你还想知道它是什么布局,那么你可以使用setTag()
将任何信息附加到视图中,然后使用getTag()
检索它 - 它可以是你的layoutId或任何东西其他
答案 2 :(得分:1)
我所做的是在创建视图时在视图持有者中保存膨胀视图的资源ID。这允许我在填充视图时获取布局资源ID。
希望这有帮助。
答案 3 :(得分:-1)
如果您要求从已夸大的布局中获取项目的ID。它是这样的: -
//Suppose you have an TextView in the inflated layout of id textView1. Here you go
convertView = inflater.inflate(layoutType, null);
TextView tv = (TextView)convertview.findViewById(R.id.textView1);