ExpandableListView 不显示子视图

Posted

技术标签:

【中文标题】ExpandableListView 不显示子视图【英文标题】:ExpandableListView not showing child views 【发布时间】:2014-06-03 17:05:34 【问题描述】:
public class ItemOptionsListAdapter extends BaseExpandableListAdapter 

private Context context;
private LayoutInflater inflater;
private List<String> categoryList;

public ItemOptionsListAdapter(Context context, List<String> categoryList) 
    this.context = context;
    this.categoryList = categoryList;
    this.inflater = LayoutInflater.from(this.context);


private TextView title(View v, int resId, String text)
    TextView tv = (TextView) v.findViewById(resId);
    tv.setText(text);
    return tv;


private ImageView image(View v, int resId, int icon)
    ImageView iv = (ImageView) v.findViewById(resId);
    return iv;


class ItemListViewHolder
    TextView title;
    ImageView dropdownArrowImage;


@Override
public int getGroupCount() 
    return categoryList.size();


@Override
public int getChildrenCount(int groupPosition) 
    return 1;


@Override
public Object getGroup(int groupPosition) 
    return categoryList.get(groupPosition);


@Override
public Object getChild(int groupPosition, int childPosition) 
    return "size";


@Override
public long getGroupId(int groupPosition) 
    return groupPosition;


@Override
public long getChildId(int groupPosition, int childPosition) 
    return 1;


@Override
public boolean hasStableIds() 
    return false;


@Override
public View getGroupView(int groupPosition, boolean isExpanded,
        View convertView, ViewGroup parent) 

    ItemListViewHolder categoryItemViewHolder;
    if(convertView == null)  
        convertView = inflater.inflate(R.layout.category_list_row_layout, null); 
        categoryItemViewHolder = new ItemListViewHolder(); 
        convertView.setTag(categoryItemViewHolder); 
     
    else  
        categoryItemViewHolder = (ItemListViewHolder) convertView.getTag(); 
    
    categoryItemViewHolder.title = title(convertView, R.id.category_name_text, categoryList.get(groupPosition));
    categoryItemViewHolder.dropdownArrowImage = image(convertView, R.id.dropdown_arrow_image, 0);
    return convertView;


@Override
public View getChildView(int groupPosition, int childPosition,
        boolean isLastChild, View convertView, ViewGroup parent) 

    if(convertView == null)  
        convertView = inflater.inflate(R.layout.item_option_list_layout, null);
     
    Log.d("child", " in getChildView()");
    TextView itemPropertyTextView = (TextView)convertView.findViewById(R.id.item_option_property);
    itemPropertyTextView.setText((String)"Size");
    return convertView;



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


我的子视图将是静态的,每个组都包含一个子视图 子布局:

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

    <TextView android:id="@+id/item_option_property"
        android:layout_
        android:layout_
        android:text="Size" />

    <RadioGroup android:id="@+id/item_option_radio_group"
        android:layout_
        android:layout_
        android:orientation="horizontal" >

       <RadioButton android:text="Small"/>
       <RadioButton android:text="Medium"/>
       <RadioButton android:text="Large"/>

   </RadioGroup> 

</LinearLayout>

组视图布局:

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

<TextView android:id="@+id/category_name_text"
    android:layout_
    android:layout_ 
    android:layout_gravity="center_vertical"
    android:textSize="16sp" 
    android:layout_weight="1"
    android:layout_margin="15dp"
    android:textColor="#ffffff" />

<ImageView android:id="@+id/dropdown_arrow_image"
    android:layout_
    android:layout_
    android:layout_gravity="center_vertical"
    android:src="@drawable/ic_arrow_down"
    android:layout_margin="15dp"
    android:rotation="270" />

</LinearLayout>

同样从日志中,我知道 getChildView 永远不会被调用

提前致谢

编辑:我刚刚注意到一件事,当 groupView 出现时,右侧的一个小滚动条会闪烁,这表明一切正常,但视图本身并不完全可见。但似乎仍然无法修复它。

我的可扩展列表 xml:

<ExpandableListView 
   android:id="@+id/item_option_list"
   android:layout_
   android:layout_ 
   android:groupIndicator="@null" >
</ExpandableListView>

【问题讨论】:

您将 getChildrenCount 硬编码为 1。 是的,因为每个组都将包含一个静态子视图 在你的getChild中你返回字符串“size”并且在你的textview中你有相同的“size”所以它总是“size”。 R U 没有获得任何单个子视图? 我没有得到任何孩子,事实上 getChildView() 根本没有被调用 确保您在组视图中没有可聚焦的视图,并且如果您设置了任何组点击侦听器,请确保您从组上单击侦听器返回 false。 【参考方案1】:

确保您已单击组标题,因为默认情况下子项是折叠的。

另外,为了确保没有焦点问题,请尝试以编程方式扩展。

expandableListView.expandGroup(0);

【讨论】:

我知道,我确实检查过,正如我所提到的,我从日志中知道 getChildView() 永远不会被调用 我记得Android使用了一种懒惰的方式,直到你扩展组时才会调用getChildView()方法。在为 ExpandableListView 设置适配器后,您可以执行一个 for 循环并展开所有组。 以编程方式展开与通过点击手动展开相比有何不同? 没有区别。以防万一您的组单击事件未触发。对了,你有OnGroupClickListener和OnGroupExpandListener的登录吗? @***tale 搜索了几个小时,却发现该组不可点击。通过以编程方式扩展组来发现这一点。谢谢你的建议。【参考方案2】:

在组的顶部布局中使用此代码:

android:descendantFocusability="blocksDescendants"

【讨论】:

【参考方案3】:

我遇到了同样的问题,我发现了我的问题。 ExpandableListView 的 layout_height 属性为 wrap_content,默认为标题。所以你有 2 个选项来解决这个问题。

选项 1:将 layout_height 固定为某个值。

android:layout_

选项 2:在 onCreateView 和任何适当的地方以编程方式更改列表视图的高度。

ViewGroup.LayoutParams params = expandableListView.getLayoutParams();
params.height = array_list.size() * 20;
expandableListView.setLayoutParams(params);
expandableListView.requestLayout();

【讨论】:

【参考方案4】:

在查看发布的代码时,一切似乎都是正确的。我建议尝试以下方法来找出问题所在。

1) 在布局膨胀部分添加以下内容。

在 getGroupView 函数中:

convertView = inflater.inflate(R.layout.category_list_row_layout, parent, false);

在 getChildView 函数中:

convertView = inflater.inflate(R.layout.item_option_list_layout, parent, false);

上述代码行将确保它从其父 ViewGroup 中获取正确的布局属性。

2) 添加日志消息 Log.d("child", " in getChildView()");在函数的开头,这将让我们知道该函数是否未被调用,或者在从给定布局渲染视图时是否有任何异常。

3) 尝试从 getChildView() 构造并返回一个简单的 TextView,然后以增量方式添加复杂的视图。

【讨论】:

这是我执行第 1 步的结果,没有更改我执行第 2 步,没有更改,日志中仍然没有我执行第 3 步,没有更改,日志中仍然没有任何内容 哦!这真的很奇怪。您能否将代码 sn-p 粘贴为您使用可扩展列表视图并将适配器提供给列表的方式。 (活动的onCreate/onStart/onResume) 我可以使用 xml 和适配器找到 xml 但找不到活动代码。 另外,您可以尝试从 getGroupView() 方法中单独返回简单的 textview,以检查是否有任何焦点问题,如 ***.com/questions/16888574/… 中所述 列表运行良好我通过将 expanableListView 周围的布局设置为 200 dp 来检查它。但是为什么 wrapContent 不适用于 expandableListView。【参考方案5】:

尝试使用其他组视图布局。我也遇到了这个问题,我在最高的 LinearLayout 中删除了一些(我认为不需要)android:,它可以工作。希望这会有所帮助!

【讨论】:

【参考方案6】:

这来得太晚了,但是对于其他读者...

问题是由您的

引起的

groupview linearlayout 具有水平方向。

android:orientation="horizontal" -> 改为将其设置为vertical

【讨论】:

【参考方案7】:

如果您使用任何具有默认属性的 Button 或 ImageButton 将不起作用。有关详细信息,请参阅this。

【讨论】:

以上是关于ExpandableListView 不显示子视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在expandablelistview中折叠组视图上方和下方的所有子视图?

如何阻止 ExpandableListView 窃取子触摸事件?

第二次冲刺个人工作总结07

ExpandableListView 显示没有子组的指示符

在 ExpandableListView 中,如何在子结果的末尾再显示一行?

以 ViewPager 作为子元素的 ExpandableListView 执行 getChildView 两次