1

我正在尝试使用 Eclipse 在 Android 中创建一个简单的任务列表。我正在尝试构建的布局是这样的:

布局

我希望任务成为组,并且在每个任务下,有 2 个具有任务描述和任务限制日期的孩子。

在任务/组的右侧,我想要一个用于将任务标记为已完成的复选框,但我真的不知道该怎么做。我什至在为我的 ExpandableListView 使用适配器时遇到问题(我设法找到的所有问题都是关于使用 ListViews 和 Maps of Strings 从废料创建 ExpandableListView,但如果可能的话,我想在我的 XML 布局中使用已经创建的 ExpandableListView)或思考如何我将从输入中添加任务(输入是按下按钮时出现的 AlertDialog)。

任何想法都会受到赞赏,并为我的英语(不是我的母语)感到抱歉。

4

1 回答 1

8

我会做这样的事情的方式是使用自定义适配器(这些扩展 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);
                }
            }
    });

您也可以将您的复选框操作代码放在那里。现在适配器看起来很重要,但它可能对您的意图来说太简单了。您希望能够根据输入的警报对话框动态设置任务。在这种情况下,您不想使用我使用的那个简单的数组(组和子项),您可能希望从数组列表或其他类型的列表中加载,您可以动态添加和删除事物,这将由您的警报对话框修改。

我希望它有所帮助,但我相信在此过程中还会有更多问题。如果有什么事情发生,你好。

于 2012-10-19T19:37:54.300 回答