我試圖在SherlockFragment內實現自定義ExpandableListView。我遵循此sample來擴展BaseExpandableListAdapter並創建我的自定義適配器。Android: - 自定義ExpandableListView:無法展開組項目以顯示ChildListView中的子項目
這是我的問題,當我的可擴展列表顯示在屏幕上時,我可以看到所有組項目,但是當我點擊其中一個項目時,應該在其下面顯示的子項目沒有出現。
我試圖調試它,我把適配器中onGroupExpandListener永遠不會被調用,實際上我把斷點在我的適配器的不同的方法,有沒有叫過,當我點擊集團之一項目。
我試圖修改我定義組件和子項目的xml文件,使它們可點擊或聚焦,沒有任何改變。我也嘗試刪除我放在那裏的editText,Button和CheckBox,認爲它可能會產生衝突...
我認爲問題可能是由於一些使用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>
你確定'mSidesCollection [groupPosition] .getSegmentsCollection()。size();'返回與'0'不同的東西嗎?此外,我不知道你是否嘗試過,但將你的視圖從組佈局設置爲不可聚焦的'android:focusable =「false」'。 – Luksprog
@Luksprog 感謝您的快速回答,我根據每個試圖點擊的組項目檢查了'mSidesCollection [groupPosition]',裏面至少有一個細分實體,所以'mSidesCollection [groupPosition] .getSegmentsCollection()。size ();'通常會返回至少1個。但問題是,無論多少次我點擊組項目或點擊它,public int getChildrenCount(int groupPosition)'方法都不會被調用,並且從來不是我的適配器的其他方法。 我也嘗試將我的組佈局中的每個視圖都設置爲不可聚焦,但沒有更多成功。 – Digoun
你確定'getChildrenCount'沒有被調用嗎?如果是這種情況,有些事情正在消耗你的羣體點擊,否則該方法應該被調用。你可以嘗試在'getGroupView'方法('view.setFocusable(false)')中的代碼中使'EditText'(和Button,所有視圖)不可聚焦嗎? – Luksprog