ExpandableListView replenishment from database - not working

I have the Receipt and Logs tables and the has_many logs receipt table. So, on my LogsRecapitulation.class, I group the logs by sort and class (these two columns are from table logs).

I am trying to do this through an ExpandableListView. Each group of parent log items will consist of Sort and Grade for each group from the database.

The children elements will have textViews for counting the logs in the child, mass, price, and some estimated price. And it should look something like this:

enter image description here

I created expandableListView layouts and an adapter. But now I have problems populating the parent and child elements from the database.

Here is my code so you can see what I have done so far.

This is the expandableListAadapter class:

public class ExpandableListAdapter extends BaseExpandableListAdapter { private Context _context; private List<String> _listDataHeader; private HashMap<String, List<String>> _listDataChild; public ExpandableListAdapter(Context context, List<String> listDataHeader, HashMap<String, List<String>> listDataChild) { this._context = context; this._listDataHeader = listDataHeader; this._listDataChild = listDataChild; } @Override public Object getChild(int groupPosition, int childPosition) { return this._listDataChild.get(this._listDataHeader.get(groupPosition)).get(childPosition); } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public View getChildView(int groupPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { final String childText = (String) getChild(groupPosition, childPosition); if (convertView == null) { LayoutInflater inflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.expendable_items, null); } TextView logsMass = (TextView) convertView.findViewById(R.id.exp_lis_mass); TextView logsPrice = (TextView) convertView.findViewById(R.id.exp_lis_price); TextView logsMassPrice = (TextView) convertView.findViewById(R.id.ext_lis_sum_price); logsMass.setText(childText); logsPrice.setText(childText); logsMassPrice.setText(childText); return convertView; } @Override public int getChildrenCount(int groupPosition) { return this._listDataChild.get(this._listDataHeader.get(groupPosition)).size(); } @Override public Object getGroup(int groupPosition) { return this._listDataHeader.get(groupPosition); } @Override public int getGroupCount() { return this._listDataHeader.size(); } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { String headerTitle = (String) getGroup(groupPosition); if (convertView == null) { LayoutInflater inflater = (LayoutInflater) this._context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); convertView = inflater.inflate(R.layout.expandable_group, null); } TextView logsSort = (TextView) convertView.findViewById(R.id.exp_gr_sort); TextView logsGrade = (TextView) convertView.findViewById(R.id.exp_gr_grade); TextView logsCount = (TextView) convertView.findViewById(R.id.exp_gr_logs_count); logsSort.setText(headerTitle); logsGrade.setText(headerTitle); logsCount.setText(headerTitle); return convertView; } @Override public boolean hasStableIds() { return false; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } } 

And this is my logsRecapitulation class:

 public class LogsRecapitulation extends AppCompatActivity { ExpandableListAdapter listAdapter; ExpandableListView expListView; List<String> listDataHeader; HashMap<String, List<String>> listDataChild; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.expandable_layout); //recieve RecepitID and query to group_by logs final long forwardedId = (long) getIntent().getExtras().get(String.valueOf("recepitID")); List<Logs> logsList = new Select().from(Logs.class).where("Receipt = " + forwardedId).groupBy("SortID, Grade").execute(); //get the listview expListView = (ExpandableListView) findViewById(R.id.lvExp); prepareListData(); listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild); expListView.setAdapter(listAdapter); } private void prepareListData() { } } 

Now my problem is populating the ExpendableListView with data from the database. Here are my table tables:

 //receipt table @Table(name = "Receipt") public class Receipt extends Model { @Column(name="Place") String place; @Column(name="ShippingNumber") String shippingNumber; @Column(name="Warehouse") String warehouse; @Column(name="Carrier") String carrier; @Column(name="LicencePlate") String licencePlate; @Column(name = "Driver") String driver; @Column(name = "Customer") String customer; @Column(name= "DestWarehouse") String destWarehouse; @Column(name = "Employee") String employee; @Column(name = "PriceType") String priceType; @Column(name = "PriceCorrection") Double priceCorrection; @Column(name = "PriceCorrection2") Double priceCorrection2; @Column(name = "Supplier") String supplier; @Column(name = "CreatedAt") Date createdAt; } //logs table @Table(name = "Logs") public class Logs extends Model { @Column(name="PlateNumber") String plate_number; @Column(name="SortID") String sort_id; @Column(name="Grade") String grade; @Column(name = "Diametar") double diameter; @Column(name="Length") double length; @Column(name="CreatedAt") Date createdAt; @Column(name="Receipt") Receipt receipt; @Column(name = "Price") Price price; } //price table @Table(name = "Price") public class Price extends Model { @Column(name = "Sort") String sort; @Column(name = "Grade") String grade; @Column(name = "Diameter") double diameter; @Column(name = "LengthDG") double lengthDG; @Column(name = "LengthGG") double lengthGG; @Column(name = "StumpPriceKn") double stumpPrice_kn; @Column(name = "RoadPriceKn") double roadPrice_kn; } 

Note. I am using ActiveAndroid.

Please, if anyone knows how to populate an extensible listView from a database, please help.

Question: What do I need to do to successfully populate an ExpandableListView from a database?

+5
source share
1 answer

I am not an expert on ActiveAndroid. But here are the steps to create an extensible list with the cursor.

In your db helper class, you'll need two methods to collect the strings you need.

 public Cursor fetchGroup() { String query = "SELECT * FROM rooms" return mDb.rawQuery(query, null); } public Cursor fetchChildren(String room) { String query = "SELECT * FROM devices WHERE id_room = '" + room + "'"; return mDb.rawQuery(query, null); } 

Then you need to configure the adapter (in your activity):

  public class MyExpandableListAdapter extends SimpleCursorTreeAdapter { public MyExpandableListAdapter(Cursor cursor, Context context,int groupLayout, int childLayout, String[] groupFrom, int[] groupTo, String[] childrenFrom, int[] childrenTo) { super(context, cursor, groupLayout, groupFrom, groupTo, childLayout, childrenFrom, childrenTo); } } @Override protected Cursor getChildrenCursor(Cursor groupCursor) { Cursor childCursor = mDbHelper.fetchChildren(groupCursor.getString(groupCursor.getColumnIndex("id_room")); getActivity().startManagingCursor(childCursor); childCursor.moveToFirst(); return childCursor; } } 

And finally, call the adapter and configure it in your list (in your activity):

 private void fillData() { mGroupsCursor = mDbHelper.fetchGroup(); getActivity().startManagingCursor(mGroupsCursor); mGroupsCursor.moveToFirst(); ExpandableListView elv = (ExpandableListView) getActivity().findViewById(android.R.id.list); mAdapter = new MyExpandableListAdapter(mGroupsCursor, getActivity(), R.layout.rowlayout_expgroup, // Your row layout for a group R.layout.rowlayout_itemlist_exp, // Your row layout for a child new String[] { "id_room" }, // Field(s) to use from group cursor new int[] { android.R.id.room }, // Widget ids to put group data into new String[] { "name_device", "state_device" }, // Field(s) to use from child cursors new int[] { R.id.device, R.id.state }); // Widget ids to put child data into lv.setAdapter(mAdapter); // set the list adapter. } } 

So all together

 public class List_Exp extends Activity { @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mDbHelper = new YourDB(getActivity()); mDbHelper.open(); fillData(); } private void fillData() { // set list adapter here } public class MyExpandableListAdapter extends SimpleCursorTreeAdapter { // Your adapter } } 

If you want to capture the click event on the group / then, then handle the events:

 lv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { @Override public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) { // Your child click code here return true; } }); lv.setOnGroupClickListener(new ExpandableListView.OnGroupClickListener() { @Override public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, int groupPosition, long id) { // Your group click code here return true; } }); 
+2
source

All Articles