对于带有非 TextView 视图的 ExpandableListView 使用什么适配器?

2024-01-08

我有一个 ExpandableListView,我想在其中包含 TextView 以外的控件。显然,SimpleExandableListViewAdapter 假定所有控件都是 TextView。如果不是,则会生成强制转换异常。

推荐的解决方案是什么?

我能想到的选项包括: - 使用其他附带的适配器。但我无法判断他们是否都有相同的假设。 - 创建我自己的适配器。是否有描述契约的文档,即适配器将遇到的方法调用序列?

我希望现有的适配器要求视图符合某些接口,以允许使用任何符合的视图,而不是硬编码到文本视图并限制它们的使用位置。


这是我实际上刚刚为我的一个应用程序编写的一些代码:

public class ExpandableAppAdapter extends BaseExpandableListAdapter
{
    private PackageManager m_pkgMgr;
    private Context m_context;
    private List<ApplicationInfo> m_groups;
    private List<List<ComponentName>> m_children;

    public ExpandableAppAdapter(Context context, List<ApplicationInfo> groups, List<List<ComponentName>> children)
    {
        m_context = context;
        m_pkgMgr = m_context.getPackageManager();
        m_groups = groups;
        m_children = children;
    }

    @Override
    public Object getChild(int groupPos, int childPos) 
    {
        return m_children.get(groupPos).get(childPos);
    }

    @Override
    public long getChildId(int groupPos, int childPos) 
    {
        return childPos;
    }

    @Override
    public int getChildrenCount(int groupPos) 
    {
        return m_children.get(groupPos).size();
    }

    @Override
    public View getChildView(int groupPos, int childPos, boolean isLastChild, View convertView, ViewGroup parent) 
    {
        if (convertView == null)
        {
            LayoutInflater inflater = LayoutInflater.from(m_context);
            convertView = inflater.inflate(R.layout.expandable_app_child_row, null);
        }

        ComponentName child = (ComponentName)getChild(groupPos, childPos);
        TextView txtView = (TextView)convertView.findViewById(R.id.item_app_pkg_name_id);
        if (txtView != null)
            txtView.setText(child.getPackageName());

        txtView = (TextView)convertView.findViewById(R.id.item_app_class_name_id);
        if (txtView != null)
            txtView.setText(child.getClassName());

        convertView.setFocusableInTouchMode(true);
        return convertView;
    }

    @Override
    public Object getGroup(int groupPos) 
    {
        return m_groups.get(groupPos);
    }

    @Override
    public int getGroupCount() 
    {
        return m_groups.size();
    }

    @Override
    public long getGroupId(int groupPos) 
    {
        return groupPos;
    }

    @Override
    public View getGroupView(int groupPos, boolean isExpanded, View convertView, ViewGroup parent) 
    {
        if (convertView == null)
        {
            LayoutInflater inflater = LayoutInflater.from(m_context);
            convertView = inflater.inflate(R.layout.expandable_app_group_row, null);
        }

        ApplicationInfo group = (ApplicationInfo)getGroup(groupPos);
        ImageView imgView = (ImageView)convertView.findViewById(R.id.item_selection_icon_id);
        if (imgView != null)
        {
            Drawable img = m_pkgMgr.getApplicationIcon(group);
            imgView.setImageDrawable(img);
            imgView.setMaxWidth(20);
            imgView.setMaxHeight(20);
        }

        TextView txtView = (TextView)convertView.findViewById(R.id.item_app_name_id);
        if (txtView != null)
            txtView.setText(m_pkgMgr.getApplicationLabel(group));

        return convertView;
    }
    @Override
    public boolean hasStableIds() 
    {
        return false;
    }
    @Override
    public boolean isChildSelectable(int groupPos, int childPos) 
    {
        return true;
    }
}

我花了比我想象的更长的时间来弄清楚……但它确实没有我想象的那么糟糕。希望有帮助!代码中还有一个 LayoutInflater 的示例。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对于带有非 TextView 视图的 ExpandableListView 使用什么适配器? 的相关文章

随机推荐