I have tables Receipt and Logs and table receipt has_many logs. So on my LogsRecapitulation.class I have grouping logs by sort and grade(those two columns are from table logs).
I have trying to made this via ExpandableListView. Each group of logs parent elements will consists of Sort and Grade for each group from database.
Children elements will have textViews for logs count in child element, mass, price and some calculated price. And it should look something like this:
I have created expandableListView layouts and adapter. But now I have trouble with populating parent and child elements from database.
Here is my code so you can see what I have done so far.
This is 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() { } }
My problem now is to populate ExpendableListView with data from database. Here are my table classes:
//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'm using ActiveAndroid.
Please if anyone knows how to populate expandable listView from database please help.
Question: What should I do to successfully populate ExpandableListView from database?
1 Answers
Answers 1
I am not an expert on ActiveAndroid.But here are the steps to create an expandablelistview using cursor.
You need two methods in your db helper class to gather the rows that you'll 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 to 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 code
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 click event on group/child then handle 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; } });
0 comments:
Post a Comment