我会做这样的事情的方式是使用自定义适配器(这些扩展 baseexpandableadapter 类)使您的可扩展列表视图。然后,您可以为您的组和子视图膨胀或创建不同的视图。这是一个示例,说明如果您使用可扩展列表活动(与使用可扩展列表视图的常规活动相比),您可以如何设置它:
public class ExpandableList1 extends ExpandableListActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set up our adapter
ExpandableListAdapter mAdapter = new MyExpandableListAdapter(this);
setListAdapter(mAdapter);
}
// The custom adapter part
public class MyExpandableListAdapter extends BaseExpandableListAdapter {
// Sample data set. children[i] contains the children (String[]) for groups[i].
private String[] groups = { "Task1", "Task2", "Task3", "Task4"};
private String[][] children = {
{ "Task Description", "Task time limit date" },
{ "Task Description", "Task time limit date" },
{ "Task Description", "Task time limit date" },
{ "Task Description", "Task time limit date" }
};
public MyExpandableListAdapter(Context context) {
super();
this.context = context;
}
private Context context;
static class ViewHolder {
TextView text;
CheckBox checkbox;
}
public Object getChild(int groupPosition, int childPosition) {
return children[groupPosition][childPosition];
}
public long getChildId(int groupPosition, int childPosition) {
return childPosition;
}
public int getChildrenCount(int groupPosition) {
return children[groupPosition].length;
}
public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
View convertView, ViewGroup parent) {
return convertView;
}
public Object getGroup(int groupPosition) {
return groups[groupPosition];
}
public int getGroupCount() {
return groups.length;
}
public long getGroupId(int groupPosition) {
return groupPosition;
}
public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
LayoutInflater viewInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = viewInflater.inflate(R.layout.mtopics_groupview, parent, false);
holder = new ViewHolder();
holder.text = (TextView)convertView.findViewById(R.id.mtopicsgrouptv);
holder.checkbox = (CheckBox)convertView.findViewById(R.id.cb_group);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(getGroup(groupPosition).toString());
return convertView;
}
public boolean isChildSelectable(int groupPosition, int childPosition) {
return true;
}
public boolean hasStableIds() {
return true;
}
}
您可以通过编程方式创建您的组视图和子视图,或者您可以从 xml 扩展这些视图。在我的示例中,我只为组视图从 xml 膨胀,因为对于更复杂的视图来说更容易。我知道该模式似乎是使用两行膨胀代码的一种迂回方法,但它会极大地帮助您的视图性能。您可以在此处了解更多信息:http ://www.youtube.com/watch?v=wDBM6wVEO70 。就目前而言,xml 非常简单,它只是一个文本视图和一个复选框。(小提示:groupviews 中的复选框必须将“focusable”设置为 false 并且不能直接与 group view 指示器相邻,否则 group view 将无法展开)
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<CheckBox
android:id="@+id/cb_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:checked="true"
android:focusable="false" />
<TextView
android:id="@+id/mtopicsgrouptv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="40dp"
android:focusable="false"
android:text="Small Text"
android:textAppearance="?android:attr/textAppearanceSmall" />
</RelativeLayout>
我没有做childview,但是根据你想用它做什么,你可以在group view之后建模。您可以在其中放置一个文本视图并根据子位置设置文本。但是我要警告你,到目前为止,你很快就会发现你的复选框状态在你点击它们时会变得古怪。有时支票会移动或消失或根本不起作用。如果你想知道为什么我可以告诉你,但我现在只发布解决方案。您必须设置一个数组列表或映射或任何真正保存复选框状态的东西,然后加载它们(因为它们的位置将对应)。这是我在 getGroupView 部分中的操作方法。
// make the list
ArrayList<Boolean> group_check_states = new ArrayList<Boolean> (groups.length);
for(int i = 0; i < groups.length; i++) {
group_check_states.add(true);
}
// load the checkstates
if ((group_check_states.get(groupPosition)) == true) {
holder.checkbox.setChecked(true);
} else {
holder.checkbox.setChecked(false);
}
// save the checkstates
holder.checkbox.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (holder.checkbox.isChecked()) {
group_check_states.set(groupPosition, true);
} else {
group_check_states.set(groupPosition, false);
}
}
});
您也可以将您的复选框操作代码放在那里。现在适配器看起来很重要,但它可能对您的意图来说太简单了。您希望能够根据输入的警报对话框动态设置任务。在这种情况下,您不想使用我使用的那个简单的数组(组和子项),您可能希望从数组列表或其他类型的列表中加载,您可以动态添加和删除事物,这将由您的警报对话框修改。
我希望它有所帮助,但我相信在此过程中还会有更多问题。如果有什么事情发生,你好。