似乎无法弄清楚 ExpandableListAdapter

Posted

技术标签:

【中文标题】似乎无法弄清楚 ExpandableListAdapter【英文标题】:Can't seem to figure out ExpandableListAdapter 【发布时间】:2011-07-08 10:28:38 【问题描述】:

我正在尝试编写一个简单的示例,该示例通过网络提取外部数据并通过ExpandableListAdapter 填充ExpandableListView。我已经尝试了几个例子并且几乎迷失了。我熟悉使用 ArrayAdapter 类,但似乎 ExpandableListAdapter 有很大不同。这是我当前不显示任何内容的应用程序代码:

MyExpandableListAdapter

public class MyExpandableListAdapter extends BaseExpandableListAdapter 

    public static class GroupHolder 
        TextView title;
    

    public static class ChildHolder 
        TextView title;
        ImageView icon;
    


    // groups.getChildren() returns the children
    private List<Group> groups;

    private Context context;

    private LayoutInflater inflater;

    public MyExpandableListAdapter(Context context, List<Group> groups) 
        this.context = context;
        this.groups = groups;
        this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    

    public boolean hasStableIds() 
        return true;
    

    public Object getGroup(int groupPosition) 
        return groups.get(groupPosition);
    

    public int getGroupCount() 
        return groups.size();
    

    public long getGroupId(int groupPosition) 
        return groupPosition;
    

    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) 
        GroupHolder holder;

        if (convertView != null) 
            holder = (GroupHolder)convertView.getTag();
         else 
            convertView = inflater.inflate(R.layout.group_item, parent, false);

            holder = new GroupHolder();
            holder.title = (TextView) convertView.findViewById(R.id.group_item_title);

            convertView.setTag(holder);
        

        holder.title.setText(this.groups.get(groupPosition).getName());

        return convertView;
    

    public boolean isChildSelectable(int groupPosition, int childPosition) 
        return true;
    

    public Object getChild(int groupPosition, int childPosition) 
        return groups.get(groupPosition).getChildren().get(childPosition);
    

    public long getChildId(int groupPosition, int childPosition) 
        return childPosition;
    

    public int getChildrenCount(int groupPosition) 
        return groups.get(groupPosition).getChildren().size();
    

    public View getChildView(int groupPosition, int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) 
        ChildHolder holder;

        if (convertView != null) 
            holder = (ChildHolder) convertView.getTag();
         else 
            convertView = inflater.inflate(R.layout.child_item, parent, false);

            holder = new ChildHolder();
            holder.title = (TextView) convertView.findViewById(R.id.child_item_title);
            holder.icon = (ImageView) convertView.findViewById(R.id.child_item_icon);

            convertView.setTag(holder);
        

        holder.title.setText(groups.get(groupPosition).getChildren().get(childPosition).getName());
//      TODO add in image loading.

        return convertView;
    

MyExpandableListActivity:

public class MyExpandableListActivity extends ExpandableListActivity 

    private List<Group> groups;

    private ExpandableListAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        setContentView(R.layout.group_list);

        this.groups = new ArrayList<Group>();
        Group group = new Group("$1", "Colors");
        Child child = new Child("$2", "Red");
        groups.getChildren().add(child);

        this.adapter = new MyExpandableListAdapter(this, groups);

        setListAdapter(this.adapter);
    

R.layout.group_list:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_
        android:layout_>

    <ExpandableListView android:id="@+id/android:list"
            android:layout_
            android:layout_/>

    <TextView android:id="@+id/android:empty"
            android:text="EMPTY! DOOM!"
            android:layout_
            android:layout_/>
</LinearLayout>

R.layout.group_item:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_
        android:layout_>

    <TextView android:id="@+id/group_item_title"/>
</LinearLayout>

R.layout.child_item:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_
        android:layout_
        android:orientation="horizontal">

    <ImageView android:id="@+id/child_item_icon"
            android:layout_ android:layout_/>

    <TextView android:id="@+id/child_item_title"/>
</LinearLayout>

当然,我看到的是“EMPTY!DOOM!”而不是我在活动中添加的列表项。我究竟做错了什么?

另外,SimpleExpandableListAdapter 似乎应该让事情变得简单,但我完全不知道它是如何工作的或如何使用它。谁能帮我解决这个问题?

【问题讨论】:

这能回答你的问题吗? How to write custom ExpandableListAdapter 【参考方案1】:

这周我对两个项目在同一时间和同一空间中尝试使用“fill_parent”有所了解。您的列表可能被推到后面或屏幕外。我看到你的 group_list 布局中有一个类似的设置。希望对隐形列表有帮助。

【讨论】:

将该布局中的所有内容更改为match_parent。还是什么都没有。 我不得不在将我的列表推开的项目上更改为 wrap_content。但是如果 getView() 没有被调用,听起来 getGroupCount 没有被调用或返回 0。 这部分对我来说不合适,但我看不出你在哪里使用组。您正在添加子项,但是您在哪里添加组或组内的子项? \n this.groups = new ArrayList(); Group group = new Group("$1", "Colors"); Child child = new Child("$2", "Red"); groups.getChildren().add(child); this.adapter = new MyExpandableListAdapter(this, groups);【参考方案2】:

如何在 group_list.xml 中将 LinearLayout 更改为垂直方向?

它与ExpandableListActivity 文档中给出的布局不太匹配。

您还可以在 getView() 方法等位置设置断点,并查看它是否被调用。

【讨论】:

编辑了我的布局,仍然没有。断点也永远不会触发。 :(

以上是关于似乎无法弄清楚 ExpandableListAdapter的主要内容,如果未能解决你的问题,请参考以下文章

margin:auto 似乎不起作用,无法弄清楚

我目前有一个问题,我试图在 grapql 中查询嵌套的猫鼬对象,但似乎无法弄清楚

无法弄清楚如何修复错误

无法弄清楚如何从 nmake 读取文件

C ++返回向量,无法弄清楚出了啥问题

无法弄清楚此示例中的指针逻辑