我正在使用数据库中的数据创建ExpandableListView
。为此,我正在使用CursorTreeAdapter
,并使用Cursor
对象填充它,其中包含我从数据库中检索的数据。
我认为,默认情况下Android会认为没有孩子的群组“不可扩展”。
然而,它仍然显示行上的展开图标,当我点击它时,它什么都不做。我不希望它显示这个图标。
我只想让有孩子的群组显示展开图标,但这不会发生。它显示所有行的扩展图标(包含子项且没有子项的行)。
更新
我研究过我的代码,我发现问题主要在于为组设置groupIndicator
。但是我尝试了很多方法,比如创建一个选择器并根据状态和可扩展设置它的drawable,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_empty="true"
android:state_expanded="false"
android:drawable="@android:color/transparent"/>
<item android:drawable="@drawable/expander_ic_maximized" />
</selector>
但是当该群组崩溃时,它会隐藏所有群组,包括那些有孩子的群组(因为Android会将折叠群体视为空)。
是否有更好的方法只为有孩子的群体设置指标?
这是我的代码。
public class ContactsExpandableListAdapter extends CursorTreeAdapter
{
TextView mContactNameTextView, mContactNumberTextView;
Cursor mChildrenCursor = null;
public ContactsExpandableListAdapter(Cursor cursor, Context context)
{
super(cursor, context);
}
@Override
protected Cursor getChildrenCursor(Cursor cursor)
{
if(mContactId == -1)
mContactId = null;
return mController.getContactById(mContactId);
}
public int getChildrenCount(int groupPosition)
{
return mChildrenCursor.getCount();
}
@Override
protected View newGroupView(Context context, Cursor cursor, boolean paramBoolean, ViewGroup viewGroup)
{
View view = LayoutInflater.from(context).inflate(R.layout.filterbycontact, viewGroup, false);
mContactNameTextView = (TextView) view.findViewById(R.id.contact_name);
if(cursor.getString(cursor.getColumnIndex("contact_name")) == null) mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number")));
else
mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_name")));
view.setTag(cursor.getString(cursor.getColumnIndex("contact_id")));
return view;
}
@Override
protected View newChildView(Context context, Cursor cursor, boolean paramBoolean, ViewGroup viewGroup)
{
View view = LayoutInflater.from(context).inflate(R.layout.filterbycontact, viewGroup, false);
if(cursor.getString(cursor.getColumnIndex("contact_name")) == null)
{
mContactNameTextView = (TextView) view.findViewById(R.id.contact_name);
mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number")));
}
else
{
mContactNumberTextView = (TextView) view.findViewById(R.id.contact_number);
mContactNumberTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number")));
}
view.setTag(cursor.getString(cursor.getColumnIndex("contact_number")));
return view;
}
@Override
protected void bindGroupView(View view, Context paramContext, Cursor cursor, boolean paramBoolean)
{
mContactNameTextView = (TextView) view.findViewById(R.id.contact_name);
if(cursor.getString(cursor.getColumnIndex("contact_name")) == null)
mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number")));
else
mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_name")));
view.setTag(cursor.getString(cursor.getColumnIndex("contact_id")));
}
@Override
protected void bindChildView(View view, Context context, Cursor cursor, boolean paramBoolean)
{
if(cursor.getString(cursor.getColumnIndex("contact_name")) == null)
{
mContactNameTextView = (TextView) view.findViewById(R.id.contact_name);
mContactNameTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number")));
}
else
{
mContactNumberTextView = (TextView) view.findViewById(R.id.contact_number);
mContactNumberTextView.setText(cursor.getString(cursor.getColumnIndex("contact_number")));
}
}
}
答案 0 :(得分:8)
在你的xml中添加下面的ExpandableListView:
android:groupIndicator="@android:color/transparent"
您的适配器中的每个组项视图都需要其内部指示器。例如,您可以在.xml的右侧添加ImageView。
然后在适配器中执行以下操作:
@Override
protected void bindGroupView(View view, Context paramContext, Cursor cursor, boolean paramBoolean)
...
if (getChildrenCount(groupPosition) > 0) {
viewHolder.indicator.setVisibility(View.VISIBLE);
viewHolder.indicator.setImageResource(
isExpanded ? R.drawable.indicator_expanded : R.drawable.indicator);
} else {
viewHolder.indicator.setVisibility(View.GONE);
}
}
答案 1 :(得分:2)
在适配器类中使用:
public View getGroupView(int groupPosition, boolean isExpanded, View convertView,ViewGroup parent)
{
if (getChildrenCount(groupPosition) == 0 ) {
indicator.setVisibility( View.INVISIBLE );
}
else {
indicator.setVisibility( View.VISIBLE );
indicator.setImageResource( isExpanded ? R.drawable.group_expanded : R.drawable.group_closed );
}
}
答案 2 :(得分:0)
为什么不让没有孩子的团体离开?
更改您的查询,只为您提供有子女的群组。