Какой адаптер использовать для ExpandableListView с представлениями без TextView? - PullRequest
2 голосов
/ 02 апреля 2010

У меня есть ExpandableListView, в котором я хотел бы иметь элементы управления, кроме TextView. Очевидно, SimpleExandableListViewAdapter предполагает, что все элементы управления являются TextViews. Исключение приведения генерируется, если это не так.

Какое рекомендуемое решение?

Опции, которые я могу придумать, включают: - Используйте другой прилагаемый адаптер. Но я не могу сказать, имеют ли они все одинаковое предположение. - Создай свой адаптер. Есть ли документ, описывающий контракт, то есть последовательность вызовов методов, с которыми столкнется адаптер?

Я ожидал, что существующие адаптеры потребуют, чтобы представления соответствовали некоторому интерфейсу, чтобы можно было использовать любое соответствующее представление, а не жестко кодировать текстовое представление и ограничивать область их использования.

Ответы [ 3 ]

2 голосов
/ 16 апреля 2010

Вот код, который я на самом деле только что написал для одного из своих приложений:

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.

0 голосов
/ 19 марта 2011

да, вы можете просто использовать методы getChildView и getGroupView, возвращающие любое пользовательское представление, которое вы хотите.

У меня есть запись в блоге, которая подробно описывает ExpandableListView здесь: http://qtcstation.com/2011/03/working-with-the-expandablelistview-part-1/

0 голосов
/ 02 апреля 2010

BaseExpandableListAdapter

Это хорошо работает, если вы последуете примеру отсюда: https://android.googlesource.com/platform/development/+/master/samples/ApiDemos/src/com/example/android/apis/view/ExpandableList1.java и вы используете пользовательский вид сборки или раздуваетесь по коду.

скопировать вставить из моего кода:

public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
                View convertView, ViewGroup parent) {
            return viewContacts.inflateRow(null, viewContacts.this, getChild(groupPosition,
                    childPosition));

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...