Reputation: 270
I'm a newbie in Android. I want to show my records in a database using an expandable list view, so that records of the same day form a group. I want something like this:
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
...
But what I get is this:
day 1
-------------------
Only one record is showing as the group view, and when I expand it, nothing shows as a child.
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>
I've been working on this for about a week and am getting pretty desperate. So please, any suggestion is welcome.
Upvotes: 0
Views: 612
Reputation: 270
It's working now. The reason is that in the fragment layout, the ExpandableListView is nested in a ScrollView. Apparently, this is not good practice, because the size of ExpandableListView could not be correctly calculated (for more explanations see this blog, unfortunately partly in Chinese). This way, you'll find that getChildView() of the base SimpleCursorTreeAdapter never gets called. That's why the child view never gets rendered.
Solution:
Get rid of ScrollView, just ExpandableListView will work fine. Or
Extend ExpandableListView as this answer does, if you have to have it nested under ScrollView.
Upvotes: 1