5

有没有办法获取视图膨胀的布局的资源 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;
}

在最坏的情况下,我根本无法重用视图,只是每次都增加我需要的布局,但这似乎非常浪费。

4

4 回答 4

5

有一种使用多种布局的官方方法,只需覆盖getViewTypeCount()getItemViewType(). 这些方法通知适配器期望多个布局,并且convertView始终是适当的布局(因此不需要检查资源 id。)请参阅此示例以获取一些示例代码。

但是,如果您想找出哪个布局是哪个,只需检查一个独特的特征。例如,您可以findViewById()在仅存在于一种布局中的 View 上使用,然后检查它是否返回null

于 2013-04-08T20:35:36.363 回答
3

列表视图支持多种布局 - 您需要返回 中使用的布局计数getViewTypeCount()和正确的布局类型getItemViewType()

如果您仍然想知道它是从哪个布局膨胀的,那么您可以使用将任何信息附加到视图setTag()并稍后使用它来检索它getTag()- 它可以是您的 layoutId 或其他任何内容。

于 2013-04-08T20:37:26.677 回答
1

我所做的是在创建视图时将膨胀视图的资源 ID 保存在视图持有者中。这允许我在填充视图时获取布局资源 ID。

希望这可以帮助。

于 2014-07-11T18:29:37.293 回答
-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);
于 2013-04-08T21:47:39.490 回答