Android: - 自定义ExpandableListView:无法展开组项以在CustomListView中显示子项

时间:2012-10-09 12:13:32

标签: android actionbarsherlock expandablelistview

我正在尝试在SherlockFragment中实现自定义ExpandableListView。我按照这个sample来扩展BaseExpandableListAdapter并创建我的自定义适配器。

这是我的问题,当我的可扩展列表显示在屏幕上时,我可以看到所有组项目,但是当我点击其中一个时,应该显示在它下面的子项目不要t出现

  1. 我试着调试它,我放在适配器中的onGroupExpandListener永远不会被调用,实际上我把断点放在我的适配器的不同方法中,当我点击其中一个组项时没有调用

  2. 我尝试修改定义组项和子项的xml文件,以使它们可单击或可聚焦,没有任何更改。我还试图删除我放在那里的editText,Button和CheckBox,认为它可能会造成冲突......

  3. 我认为问题可能是由于使用带有SherlockFragment的ExpandableListView的一些不兼容问题,但根据开发人员的forum而不是。

  4. 所以我真的不知道现在在哪里看,这可能只是我在我的适配器中做的新手错误...... 任何帮助都会很棒,

    提前致谢!


    这是我的代码:

    public class BuildingExpandalbeListAdapter extends BaseExpandableListAdapter {
    
    private Context mContext;
    private ExpandableListView mExpandableListView;
    private SideEntity[] mSidesCollection;
    private int[] groupStatus;
    
    public BuildingExpandalbeListAdapter(Context pContext,
            ExpandableListView pExpandableListView,
            SideEntity[] pSidesCollection) {
        mContext = pContext;
        mSidesCollection = pSidesCollection;
        mExpandableListView = pExpandableListView;
        groupStatus = new int[mSidesCollection.length];
        mExpandableListView.setClickable(true);     
        setListEvent();
    }
    
    private void setListEvent() {
    
        mExpandableListView
                .setOnGroupExpandListener(new OnGroupExpandListener() {
    
                    @Override
                    public void onGroupExpand(int arg0) {
                        // TODO Auto-generated method stub
                        groupStatus[arg0] = 1;
                    }
                });
    
        mExpandableListView
                .setOnGroupCollapseListener(new OnGroupCollapseListener() {
    
                    @Override
                    public void onGroupCollapse(int arg0) {
                        // TODO Auto-generated method stub
                        groupStatus[arg0] = 0;
                    }
                });
    }
    
    @Override
    public Object getChild(int groupPosition, int childPosition) {
        return mSidesCollection[groupPosition].getSegmentEntity(childPosition)
                .getName();
    }
    
    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return mSidesCollection[groupPosition].getSegmentEntity(childPosition)
                .getId();
    }
    
    @Override
    public View getChildView(int groupPosition, int childPosition,
            boolean isLastChild, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ChildHolder childHolder;
        if (convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(
                    R.layout.building_list_item, null);
    
            childHolder = new ChildHolder();
    
            childHolder.editText1 = (EditText) convertView
                    .findViewById(R.id.editText1);
            childHolder.checkBox1 = (CheckBox) convertView
                    .findViewById(R.id.checkBox1);
            convertView.setTag(childHolder);
        } else {
            childHolder = (ChildHolder) convertView.getTag();
        }
    
        childHolder.editText1.setText(mSidesCollection[groupPosition]
                .getSegmentEntity(childPosition).getName());
        childHolder.checkBox1.setChecked(mSidesCollection[groupPosition]
                .getSegmentEntity(childPosition).hasDoor());
        return convertView;
    }
    
    @Override
    public int getChildrenCount(int groupPosition) {
        // TODO Auto-generated method stub
        return mSidesCollection[groupPosition].getSegmentsCollection().size();
    }
    
    @Override
    public Object getGroup(int groupPosition) {
        // TODO Auto-generated method stub
        return mSidesCollection[groupPosition];
    }
    
    @Override
    public int getGroupCount() {
        // TODO Auto-generated method stub
        return mSidesCollection.length;
    }
    
    @Override
    public long getGroupId(int groupPosition) {
        // TODO Auto-generated method stub
        return groupPosition;
    }
    
    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
            View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        GroupHolder groupHolder;
        if (convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(
                    R.layout.building_list_group, null);
            groupHolder = new GroupHolder();
            groupHolder.editText1 = (EditText) convertView
                    .findViewById(R.id.editText1);
            groupHolder.editText2 = (EditText) convertView
                    .findViewById(R.id.editText2);
            convertView.setTag(groupHolder);
        } else {
            groupHolder = (GroupHolder) convertView.getTag();
        }
    
        groupHolder.editText1
                .setText(mSidesCollection[groupPosition].getName());
        groupHolder.editText2.setText(Integer
                .toString(mSidesCollection[groupPosition]
                        .getSegmentsCollection().size()));
    
        return convertView;
    }
    
    class GroupHolder {
        EditText editText1;
        EditText editText2;
    }
    
    class ChildHolder {
        EditText editText1;
        CheckBox checkBox1;
    }
    
    @Override
    public boolean hasStableIds() {
        // TODO Auto-generated method stub
        return true;
    }
    
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        // TODO Auto-generated method stub
        return true;
    }
    
    }
    

    这是我使用此适配器的SherlockFragment:

    public class BuildingFragment extends SherlockFragment {
    
    private ViewGroup myViewGroup;
    private View v;
    private SideEntity[] mSideCollection;
    
    private BuildingsDbAdapter buildingDataBase;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
    
        if (container == null) {
            return null;
        }
        myViewGroup = container;
        myViewGroup.removeAllViews();
        v = inflater.inflate(R.layout.building_data_layout, container, false);
        buildingDataBase = new BuildingsDbAdapter(getSherlockActivity());
        return v;
    }
    
    @Override
    public void onResume() {
        super.onResume();
        buildingDataBase.open();
        mSideCollection = BuildingsDbAdapter
                .fetchSideMatchingBuildingId(CustomTabFragmentActivity.mBuildingId);
        for (int i = 0; i < mSideCollection.length; i++) {
            BuildingsDbAdapter.fetchSegmentMatchingSideId(
                    mSideCollection[i].getId(), mSideCollection[i]);
        }
        ExpandableListView mExpandableListView = (ExpandableListView) v
                .findViewById(R.id.expandableListView1);
        BuildingExpandalbeListAdapter mAdapter = new BuildingExpandalbeListAdapter(
                v.getContext().getApplicationContext(), mExpandableListView,
                mSideCollection);
        mExpandableListView.setAdapter(mAdapter);
        buildingDataBase.close();
    }
    }
    

    这是我的xml文件:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/linearLayout1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_gravity="left|center_vertical"
            android:layout_marginLeft="10dip"
            android:layout_weight="3"
            android:singleLine="true"
            android:text="Building name: "
            android:textColor="@android:color/black"
            android:textSize="13dip" />
    
        <TextView
            android:id="@+id/textView2"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_gravity="left|center_vertical"
            android:layout_marginLeft="10dip"
            android:layout_weight="4"
            android:singleLine="true"
            android:text="Columbia Tower"
            android:textColor="@android:color/black"
            android:textSize="15dip"
            android:textStyle="italic" />
    
       <!--  <Button
            android:id="@+id/button1"
            android:layout_width="0dip"
            android:layout_height="30dp"
            android:layout_gravity="right|center_vertical"
            android:layout_marginRight="10dip"
            android:layout_weight="1"
            android:background="@color/honeycombish_blue"
            android:drawableTop="@drawable/edit_query"
            android:gravity="center_vertical|center_horizontal" /> -->
    </LinearLayout>
    
    <ExpandableListView
        android:id="@+id/expandableListView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:scrollbars="none"
        android:divider="@android:color/black"
        android:clipChildren="false"
        android:focusable="true" >
    </ExpandableListView>
    
    </LinearLayout>
    

    group_item:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:clickable="true"
    android:gravity="center_vertical"
    android:orientation="vertical" >
    
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/linearLayout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/RelativeLayout"
        android:layout_marginTop="6dip"
        android:layout_toLeftOf="@+id/button1"
        android:orientation="horizontal" >
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_gravity="left|center_vertical"
            android:layout_marginLeft="5dip"
            android:layout_weight="2"
            android:singleLine="true"
            android:text="Side: "
            android:textColor="@android:color/black"
            android:textSize="13dip" />
    
        <EditText
            android:id="@+id/editText1"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_gravity="left|center_vertical"
            android:layout_marginLeft="5dip"
            android:layout_weight="2"
            android:singleLine="true"
            android:textColor="@android:color/black"
            android:textSize="15dip"
            android:textStyle="italic" />
    
        <TextView
            android:id="@+id/textView3"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_gravity="left|center_vertical"
            android:layout_marginLeft="5dip"
            android:layout_weight="5"
            android:singleLine="true"
            android:text="Number of Segment:"
            android:textColor="@android:color/black"
            android:textSize="13dip" />
    
        <EditText
            android:id="@+id/editText2"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_gravity="left|center_vertical"
            android:layout_marginLeft="5dip"
            android:layout_weight="2"
            android:ems="10"
            android:inputType="number"
            android:text="0"
            android:textSize="13dip" />
    </LinearLayout>
    
    <Button
        android:id="@+id/button1"
        android:layout_width="30dip"
        android:layout_height="30dip"
        android:layout_alignBottom="@+id/linearLayout1"
        android:layout_alignParentRight="true"
        android:layout_marginLeft="2dip"
        android:background="@android:color/transparent"
        android:drawableBottom="@drawable/ic_edit_shape"
        android:gravity="bottom|center_horizontal" />
    
    </RelativeLayout>
    

    list_item:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true"
    android:orientation="vertical" >
    
    <Button
        android:id="@+id/button1"
        android:layout_width="30dip"
        android:layout_height="30dip"
        android:layout_alignBottom="@+id/linearLayout1"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="2dip"
        android:background="@android:color/transparent"
        android:drawableBottom="@drawable/ic_edit_shape"
        android:gravity="bottom|center_horizontal" />
    
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/linearLayout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/RelativeLayout"
        android:layout_marginTop="6dip"
        android:layout_toRightOf="@+id/button1"
        android:orientation="horizontal" >
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_gravity="left|center_vertical"
            android:layout_marginLeft="5dip"
            android:layout_weight="2"
            android:singleLine="true"
            android:text="Name: "
            android:textColor="@android:color/black"
            android:textSize="13dip" />
    
        <EditText
            android:id="@+id/editText1"
            android:layout_width="0dip"
            android:layout_height="wrap_content"
            android:layout_gravity="left|center_vertical"
            android:layout_marginLeft="5dip"
            android:layout_weight="2"
            android:singleLine="true"
            android:text="Shop1"
            android:textColor="@android:color/black"
            android:textSize="15dip"
            android:textStyle="italic" />
    
        <CheckBox
            android:id="@+id/checkBox1"
            android:layout_width="0dip"
            android:layout_height="30dip"
            android:layout_weight="1"
            android:hint="Door" />
    </LinearLayout>
    
    </RelativeLayout>
    

1 个答案:

答案 0 :(得分:3)

好的,我发现了我的错误,问题实际上来自EditText和我在团队项目中使用的Button。当我将此窗口小部件设置为不可点击且无法关注时,我的群组项目的点击会正常执行。

我应该早点发现这个冲突,我之前尝试删除我的Button和我的EditText,但我忘了在某些时候我曾尝试将android:clickable="true"添加到我的RelativeLayout(认为它会允许点击在我的组项目上),但它也产生了冲突:/ 无论如何,如果有人遇到类似问题,请记住检查您的群组项目中的任何视图是否可点击或可关注,并将其设置为android:clickable="false" android:focusable="false"