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 窃取子触摸事件?