我是Android的新手。我想使用可扩展列表视图在数据库中显示我的记录,以便同一天的记录形成一个组。我想要这样的东西:
day 1
-------------------
record 1 of day 1
record 2 of day 1
day 2
-------------------
record 1 of day 2
record 2 of day 2
record 3 of day 2
...
但我得到的是:
day 1
-------------------
只有一条记录显示为组视图,当我展开它时,没有任何内容显示为子视图。
FirstFragment.java:
public class FirstFragment extends Fragment {
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
createExpandableListView();
}
private void createExpandableListView() {
String time = Long.toString(((ShowBillBookActivity)getActivity()).book.getTime().getTimeInMillis());
BillTableHandler handler = new BillTableHandler(getActivity(),
((MyApplication) getActivity().getApplication()).BILL_TABLE_NAME_PREFIX + time);
ExpandableListView view = (ExpandableListView) getView().findViewById(R.id.expandableListView);
Cursor c = handler.getAllBills();
Log.d("tag", "handler.getAllbills(): "+c.getCount());
ExpandableListAdapter adapter = new ExpandableListAdapter(handler,
this.getActivity(),
handler.getAllBills(),
R.layout.group_expandable_list_view,
new String[]{BillEntry.DAY, BillEntry.AMOUNT},
new int[]{R.id.textview_time, R.id.textview_extra},
R.layout.child_expandable_list_view,
new String[]{BillEntry.PAYER, BillEntry.AMOUNT},
new int[]{R.id.textview_payer, R.id.textview_amount});
view.setAdapter(adapter);
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
}
ExpandableListAdapter.java
public class ExpandableListAdapter extends SimpleCursorTreeAdapter {
BillTableHandler handler;
public ExpandableListAdapter(BillTableHandler handler, Context context, Cursor cursor, int groupLayout,
String[] groupFrom, int[] groupTo, int childLayout, String[] childFrom,
int[] childTo){
super(context, cursor, groupLayout, groupFrom, groupTo, childLayout, childFrom, childTo);
this.handler = handler;
}
@Override
protected Cursor getChildrenCursor(Cursor groupCursor) {
long time = groupCursor.getLong(groupCursor.getColumnIndexOrThrow(BillTableHandler.BillEntry.DAY));
Cursor c = handler.getBillsOfTime(time);
Log.d("tag","child Count : "+c.getCount());
c.moveToFirst();
return c;
}
}
group_expandable_list_view.xml
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:focusable="false"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textview_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:text="TextView"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textview_extra"
android:layout_width="61dp"
android:layout_height="18dp"
android:text="TextView"
app:layout_constraintLeft_toRightOf="@+id/textview_time"
android:layout_marginLeft="32dp"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="8dp" />
</android.support.constraint.ConstraintLayout>
child_expandable_list_view.xml
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:focusable="false"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textview_payer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_marginTop="8dp"
android:text="hello"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textview_amount"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="32dp"
android:layout_marginTop="8dp"
android:text="world"
app:layout_constraintLeft_toRightOf="@+id/textview_payer"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:text="text"
app:layout_constraintTop_toBottomOf="@+id/textview_amount"
android:layout_marginLeft="8dp"
app:layout_constraintLeft_toLeftOf="parent" />
</android.support.constraint.ConstraintLayout>
我已经在这方面工作了大约一个星期,我变得非常绝望。所以,欢迎任何建议。
答案 0 :(得分:0)
现在正在运作。原因是在片段布局中, ExpandableListView 嵌套在 ScrollView 中。显然,这不是一个好习惯,因为无法正确计算 ExpandableListView 的大小(更多解释见this blog,不幸的是部分用中文)。这样,您就会发现基本 SimpleCursorTreeAdapter 的 getChildView()永远不会被调用。这就是孩子视图永远不会被渲染的原因。
解决方案:
摆脱 ScrollView ,只需 ExpandableListView 即可。或
将 ExpandableListView 扩展为this answer,如果您必须将其嵌套在 ScrollView 下。