2012-10-09 13 views
2

我試圖在SherlockFragment內實現自定義ExpandableListView。我遵循此sample來擴展BaseExpandableListAdapter並創建我的自定義適配器。Android: - 自定義ExpandableListView:無法展開組項目以顯示ChildListView中的子項目

這是我的問題,當我的可擴展列表顯示在屏幕上時,我可以看到所有組項目,但是當我點擊其中一個項目時,應該在其下面顯示的子項目沒有出現

  1. 我試圖調試它,我把適配器中onGroupExpandListener永遠不會被調用,實際上我把斷點在我的適配器的不同的方法,有沒有叫過,當我點擊集團之一項目。

  2. 我試圖修改我定義組件和子項目的xml文件,使它們可點擊或聚焦,沒有任何改變。我也嘗試刪除我放在那裏的editText,Button和CheckBox,認爲它可能會產生衝突...

  3. 我認爲問題可能是由於一些使用ExpandableListView與SherlockFragment不兼容的問題,但根據開發商的forum其沒有。

所以,我真的不知道在哪裏,現在看,它可能只是一個新手的錯誤我在適配器沒有... 任何幫助將是巨大的,提前

謝謝!


這裏是我的代碼:

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> 
+0

你確定'mSidesCollection [groupPosition] .getSegmentsCollection()。size();'返回與'0'不同的東西嗎?此外,我不知道你是否嘗試過,但將你的視圖從組佈局設置爲不可聚焦的'android:focusable =「false」'。 – Luksprog

+0

@Luksprog 感謝您的快速回答,我根據每個試圖點擊的組項目檢查了'mSidesCollection [groupPosition]',裏面至少有一個細分實體,所以'mSidesCollection [groupPosition] .getSegmentsCollection()。size ();'通常會返回至少1個。但問題是,無論多少次我點擊組項目或點擊它,public int getChildrenCount(int groupPosition)'方法都不會被調用,並且從來不是我的適配器的其他方法。 我也嘗試將我的組佈局中的每個視圖都設置爲不可聚焦,但沒有更多成功。 – Digoun

+0

你確定'getChildrenCount'沒有被調用嗎?如果是這種情況,有些事情正在消耗你的羣體點擊,否則該方法應該被調用。你可以嘗試在'getGroupView'方法('view.setFocusable(false)')中的代碼中使'EditText'(和Button,所有視圖)不可聚焦嗎? – Luksprog

回答

3

好吧,我發現我的錯誤,這個問題實際上來自EditText上,我一直用我的項目組中的按鈕來。當我將此小部件設置爲不可點擊且不可對焦時,點擊我的羣組項目時表現正常。

我應該儘早檢測到這個衝突,我之前試圖刪除我的Button和我的EditText,但是我忘記了在某些時候我曾嘗試將android:clickable="true"添加到我的RelativeLayout中(認爲它可以點擊我的組物品),但它也產生了衝突:無論如何,如果有人有類似的問題,請記住檢查您的組內物品的任何視圖是可點擊或可聚焦的,並將它們設置爲android:clickable="false" android:focusable="false"

+0

我認爲這是你的佈局中的東西。不要忘記接受你的答案。 – Luksprog

+0

是的,你認爲是正確的,再次感謝您的幫助:) – Digoun

+0

我也有EditText。但我需要在其中輸入一些文字。按鈕和組項目現在可以點擊。但我怎樣才能使edittext採取輸入。現在沒有采取投入。 –

相關問題