【问题标题】:Get resource id from which view was inflated获取视图被夸大的资源 id
【发布时间】:2013-04-08 20:32:49
【问题描述】:

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

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

【问题讨论】:

    标签: android android-layout listview android-resources


    【解决方案1】:

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

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

    【讨论】:

    • 我不明白我是如何错过这个多布局功能的,但谢谢。还要感谢您提供有关查找布局类型的建议,现在不再需要,但还是很高兴知道。不过,我觉得很奇怪,没有官方的方法来获得膨胀视图的布局。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      希望这会有所帮助。

      【讨论】:

        【解决方案4】:

        如果您要求从已膨胀的布局中获取项目的 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);
        

        【讨论】:

        • 以上代码如何返回充气物品的id。 findviewbyid 只返回视图而不是 id
        猜你喜欢
        • 2012-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-28
        • 2020-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多