2013-01-22 93 views
0

我想通過調整我找到的一些代碼來定製一個expandableListView。這將調用一個自定義適配器,併爲列表視圖擴充所需的行。android:自定義ExpandableListView

我的問題:我需要使用其他佈局組件,所以爲了我需要調用setContentView然後膨脹listView我需要它。我的所有嘗試都以應用程序崩潰結束,有人能告訴我如何調整下面的代碼以在Layout中工作。

MainActivity:

public class MainActivity extends ExpandableListActivity implements 
    OnChildClickListener { 
private static final String[] Groups = { "G1", "G2", 
     "G3", "G4" }; 
private static final String[] Services = { "Service1", 
     "Service2", "Service3", "Service4", "Service5", 
     "Service6" }; 
private static final String[] Test = { "Test1", "Test2", 
    "Test3", "Test4" }; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 


    ExpandableListView expandbleLis = getExpandableListView(); 
    expandbleLis.setDividerHeight(2); 
    expandbleLis.setGroupIndicator(null); 
    expandbleLis.setClickable(true); 

    setGroupData(); 
    setChildGroupData(); 

    NewAdapter mNewAdapter = new NewAdapter(groupItem, childItem); 
    mNewAdapter 
      .setInflater(
        (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE), 
        this); 
    expandbleLis.setAdapter(mNewAdapter); 
    expandbleLis.setOnChildClickListener(this); 
} 

public void setGroupData() { 
    for (int i = 0; i < 4; i++) { 
     groupItem.add(Groups[i]); 
    } 
} 

ArrayList<String> groupItem = new ArrayList<String>(); 
ArrayList<Object> childItem = new ArrayList<Object>(); 

public void setChildGroupData() { 
    /** 
    * Add Data For Services 
    */ 
    ArrayList<String> child = new ArrayList<String>(); 
    for (int i = 0; i < 6; i++) { 
     child.add(Services[i]); 
    } 
    childItem.add(child); 

    /** 
    * Add Data For Test 
    */ 
    child = new ArrayList<String>(); 
    for (int i = 0; i < 4; i++) { 
     child.add(Test[i]); 
    } 
    childItem.add(child); 
    /** 
    * 
    */ 
    child = new ArrayList<String>(); 
    child.add("Dummy Text"); 
    child.add("Dummy Text"); 
    child.add("Dummy Text"); 
    child.add("Dummy Text"); 
    childItem.add(child); 
    /** 
    * 
    */ 
    child = new ArrayList<String>(); 
    child.add("Dummy Text"); 
    child.add("Dummy Text"); 
    child.add("Dummy Text"); 
    child.add("Dummy Text"); 
    childItem.add(child); 
} 

@Override 
public boolean onChildClick(ExpandableListView parent, View v, 
     int groupPosition, int childPosition, long id) { 
    Toast.makeText(MainActivity.this, "Clicked On Child", 
      Toast.LENGTH_SHORT).show(); 
    return true; 
} 
    } 

適配器類:

public class NewAdapter extends BaseExpandableListAdapter { 

public ArrayList<String> groupItem, tempChild; 
public ArrayList<Object> Childtem = new ArrayList<Object>(); 
public LayoutInflater minflater; 
public Activity activity; 

public NewAdapter(ArrayList<String> grList, ArrayList<Object> childItem) { 
    groupItem = grList; 
    this.Childtem = childItem; 
} 

public void setInflater(LayoutInflater mInflater, Activity act) { 
    this.minflater = mInflater; 
    activity = act; 
} 

@Override 
public Object getChild(int groupPosition, int childPosition) { 
    return null; 
} 

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

@SuppressWarnings("unchecked") 
@Override 
public View getChildView(int groupPosition, final int childPosition, 
     boolean isLastChild, View convertView, ViewGroup parent) { 
    tempChild = (ArrayList<String>) Childtem.get(groupPosition); 
    TextView text = null; 
    if (convertView == null) { 
     convertView = minflater.inflate(R.layout.childrow, null); 
    } 
    text = (TextView) convertView.findViewById(R.id.textView1); 
    text.setText(tempChild.get(childPosition)); 
    convertView.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Toast.makeText(activity, tempChild.get(childPosition), 
        Toast.LENGTH_SHORT).show(); 
     } 
    }); 
    return convertView; 
} 

@Override 
public int getChildrenCount(int groupPosition) { 
    return ((ArrayList<String>) Childtem.get(groupPosition)).size(); 
} 

@Override 
public Object getGroup(int groupPosition) { 
    return null; 
} 

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

@Override 
public void onGroupCollapsed(int groupPosition) { 
    super.onGroupCollapsed(groupPosition); 
} 

@Override 
public void onGroupExpanded(int groupPosition) { 
    super.onGroupExpanded(groupPosition); 
} 

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

@Override 
public View getGroupView(int groupPosition, boolean isExpanded, 
     View convertView, ViewGroup parent) { 
    if (convertView == null) { 
     convertView = minflater.inflate(R.layout.grouprow, null); 
    } 
    ((CheckedTextView) convertView).setText(groupItem.get(groupPosition)); 
    ((CheckedTextView) convertView).setChecked(isExpanded); 
    return convertView; 
} 

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

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

回答

1

你要叫setContentView通過其中包含一個ExpandableListView id爲@android:id/list的佈局。
然後,你可以得到這個ExpandableListView調用getExpandableListView()

順便說一句,因爲你可以用XML自定義你的ExpandableListView,所以你不必調用這個方法,而只會使用setListAdapter()
您的活動無需執行OnChildClickListener並致電setOnChildClickListener,您只需覆蓋ExpandableListActivity的方法onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id)即可。

請參見此link以獲得佈局示例。
並在接下來的時間,不要忘記發佈你得到的例外日誌。

+0

謝謝。我怎樣才能通過XML禁用GroupIndicator(如將其設置爲空)? – Droidman

+0

嘗試'android:groupIndicator =「@ null」'或'android:groupIndicator =「@ android:color/transparent」'。 – yDelouis