ExpandableListView 显示没有子组的指示符

Posted

技术标签:

【中文标题】ExpandableListView 显示没有子组的指示符【英文标题】:ExpandableListView is showing indicator for groups with no child 【发布时间】:2012-07-03 01:23:00 【问题描述】:

我正在使用数据库中的数据创建一个ExpandableListView。为此,我使用了CursorTreeAdapter,并使用包含我从数据库检索的数据的Cursor 对象填充它。

我认为,默认情况下,android 会考虑没有子的组“不可扩展”

但是它仍然在行上显示展开图标,当我单击它时,它什么也不做。我不希望它显示这个图标。

我只希望有孩子的组显示展开图标,但这种情况不会发生。它显示所有行(有子行和没有子行)的展开图标。


更新

我研究了我的代码,发现问题基本上在于为组设置groupIndicator。但是我尝试了很多方法,例如创建选择器并根据状态设置它的可绘制和可扩展,如下所示:

<?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")));
            
        
    

【问题讨论】:

【参考方案1】:

在您的 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);
    

【讨论】:

如何在 void 方法中返回视图? heheh 也许它应该在newGroupView() 方法中正确?顺便说一句,viewHolder 是什么,indicator 是什么? 对不起。回报是错误的,真实的。在游标适配器中不需要返回视图:D。关于 ViewHolder(一种加快列表速度的模式):youtube.com/… 他正在建立以上链接来谈论 ViewHolder。然后他在youtube.com/… 解释它 如果 ViewHolder 现在太复杂,只需像以前一样使用 view.findViewById(...) ;-)【参考方案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 );
    

【讨论】:

这里的指标是什么? Indicator 是 ExpandableListView 右侧的图标,看起来像 V 。它显示了 listview 的状态,如展开或折叠。【参考方案3】:

为什么不把没有孩子的小组排除在外?

更改您的查询,只为您提供将有孩子的组。

【讨论】:

但是我想显示没有孩子的项目,但只显示联系号码,只是一行没有扩展。

以上是关于ExpandableListView 显示没有子组的指示符的主要内容,如果未能解决你的问题,请参考以下文章

ExpandableListView使用-ScrollView嵌套ExpandableListView,列表显示不全

R - 子组计数的可反应总和

监听器无法识别 ExpandableListView OnLongClick

ExpandableListView 不显示子视图

如何自定义 ExpandableListView 目前仅显示一项“已扩展”

ExpandableListView 安卓二级菜单