9

我試着去弄清楚如何構建一個包含(很多)的一個觀點:ANDROID - ExpandableListView

  • PARENT1(可檢查的,可擴展)
  • CHILD1(單選按鈕)
  • CHILD2(單選按鈕)

...

  • PARENT2(可檢查的,EXP andable)
  • CHILD1(可檢查的)
  • CHILD2(可檢查的)

...

的一點是,父母必須是可檢查,並根據孩子有更改圖標。有些人可以指引我走向正確的方向,因爲從我發現的東西看來什麼都不適合我。

回答

16

我認爲,你有你的數據在某種程度上結構,如: ArrayList的地方

  • 父{名:字符串,託運:布爾, 孩子:ArrayList中}和
  • 兒童{名稱:字符串}

如果是的話,你只需要做兩兩件事:

  1. CR爲您的 父項呈示器和子項渲染器
  2. 擴展BaseExpandableListAdapter爲 自己建立列表。

下面是關於什麼是我心中的小樣本:
佈局/ grouprow.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout android:orientation="horizontal" 
    android:gravity="fill" android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- PARENT --> 
    <TextView android:id="@+id/parentname" android:paddingLeft="5px" 
     android:paddingRight="5px" android:paddingTop="3px" 
     android:paddingBottom="3px" android:textStyle="bold" android:textSize="18px" 
     android:layout_gravity="fill_horizontal" android:gravity="left" 
     android:layout_height="wrap_content" android:layout_width="wrap_content" /> 
    <CheckBox android:id="@+id/checkbox" android:focusable="false" 
     android:layout_alignParentRight="true" android:freezesText="false" 
     android:layout_width="wrap_content" android:layout_height="wrap_content" 
     android:layout_marginTop="5px" /> 
</RelativeLayout> 

佈局/ childrow.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="wrap_content" android:padding="0px"> 
    <!-- CHILD --> 
    <TextView android:id="@+id/childname" android:paddingLeft="15px" 
     android:paddingRight="5px" android:focusable="false" android:textSize="14px" 
     android:layout_marginLeft="10px" android:layout_marginRight="3px" 
     android:layout_width="fill_parent" android:layout_height="wrap_content" /> 
</LinearLayout> 

MyELAdapter類:我已經聲明這是一個內部類MyExpandableList,所以我可以直接到達父母列表,而不必將它作爲參數傳遞。

private class MyELAdapter extends BaseExpandableListAdapter 
{ 
    private LayoutInflater inflater; 

    public MyELAdapter() 
    { 
     inflater = LayoutInflater.from(MyExpandableList.this); 
    } 

    @Override 
    public View getGroupView(int groupPosition, boolean isExpanded, 
      View convertView, ViewGroup parentView) 
    { 
     final Parent parent = parents.get(groupPosition); 
     convertView = inflater.inflate(R.layout.grouprow, parentView, false); 
     ((TextView) convertView.findViewById(R.id.parentname)).setText(parent.getName()); 
     CheckBox checkbox = (CheckBox) convertView.findViewById(R.id.checkbox); 
     checkbox.setChecked(parent.isChecked()); 
     checkbox.setOnCheckedChangeListener(new CheckUpdateListener(parent)); 
     if (parent.isChecked()) 
      convertView.setBackgroundResource(R.color.red); 
     else 
      convertView.setBackgroundResource(R.color.blue); 
     return convertView; 
    } 

    @Override 
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, 
      View convertView, ViewGroup parentView) 
    { 
     final Parent parent = parents.get(groupPosition); 
     final Child child = parent.getChildren().get(childPosition); 
     convertView = inflater.inflate(R.layout.childrow, parentView, false); 
     ((TextView) convertView.findViewById(R.id.childname)).setText(child.getName()); 
     return convertView; 
    } 

    @Override 
    public Object getChild(int groupPosition, int childPosition) 
    { 
     return parents.get(groupPosition).getChildren().get(childPosition); 
    } 

    @Override 
    public long getChildId(int groupPosition, int childPosition) 
    { 
     return childPosition; 
    } 

    @Override 
    public int getChildrenCount(int groupPosition) 
    { 
     return parents.get(groupPosition).getChildren().size(); 
    } 

    @Override 
    public Object getGroup(int groupPosition) 
    { 
     return parents.get(groupPosition); 
    } 

    @Override 
    public int getGroupCount() 
    { 
     return parents.size(); 
    } 

    @Override 
    public long getGroupId(int groupPosition) 
    { 
     return groupPosition; 
    } 

    @Override 
    public void notifyDataSetChanged() 
    { 
     super.notifyDataSetChanged(); 
    } 

    @Override 
    public boolean isEmpty() 
    { 
     return ((parents == null) || parents.isEmpty()); 
    } 

    @Override 
    public boolean isChildSelectable(int groupPosition, int childPosition) 
    { 
     return true; 
    } 

    @Override 
    public boolean hasStableIds() 
    { 
     return true; 
    } 

    @Override 
    public boolean areAllItemsEnabled() 
    { 
     return true; 
    } 
} 

您必須已經有一個公共類MyExpandableList extends ExpandableListActivity其中有一個成員:

private ArrayList<Parent> parents; 

你賦值給這個會員後/加載家長的名單,你還應該附上您的適配器連接到本查看:

this.setListAdapter(new MyELAdapter()); 

就是這樣。你有一個可檢查的可擴展列表,並且在CheckUpdateListeneronCheckedChanged(CompoundButton buttonView, boolean isChecked)方法中,你可以更新父對象的選中狀態。

請注意,背景色是在getGroupView方法中確定的,因此您不必在任何地方更改它,只需根據需要調用適配器的notifyDataSetChanged()方法即可。

更新

你可以從this link下載示例源代碼。這是一個eclipse項目,但是如果你使用其他開發環境,只需簡單地複製必要的源文件(java + xml)即可。

+0

thanx rekaszeru。既然我是一個begginer,你會不會喜歡分享一個工作樣本? – no9 2011-04-13 08:21:38

+1

當然,我只需要幾分鐘就可以建立一個。這將是有用的,但如果我知道你從哪裏獲得數據(服務器或本地)。 – rekaszeru 2011-04-13 08:53:00

+0

如果可以的話,請建立一個非常簡單的例子(只是一些測試數據與一堆數組)。我正在爲緊湊框架樹視圖設計XML數據。我將不得不自己格式化數據,但在這個階段我不知道如何。現在我對消耗性清單本身的結構感興趣。複選框,單選按鈕等 – no9 2011-04-13 09:41:39