Depurando ExpandableListView de la base de datos – no funciona
Tengo tablas Recibo y registros y recibo de la tabla has_many logs. Así que en mi LogsRecapitulation.class tengo los registros de agrupación por orden y grado (esas dos columnas son de los registros de tabla).
Tengo que tratar de hacer esto a través de ExpandableListView. Cada grupo de registros de los elementos principales consistirá en Ordenar y Grado para cada grupo de la base de datos.
- Android One Plus Two: No se pudo cambiar la configuración regional para db
- ListView no se actualiza al agregar a SQLiteDatabase
- Implementación SQLite deficiente? Acceso a los datos por primera vez demasiado lento
- La base de datos Android está dañada, pero puede abrirse en SQLite Manager. ¿Recuperable?
- Base de datos SQLite para aplicaciones de Android con múltiples usuarios potenciales
Los elementos de los niños tendrán textViews para los registros cuentan en el elemento del niño, la masa, el precio y un cierto precio calculado. Y debería verse algo así:
He creado diseños y adaptador expansibleListView. Pero ahora tengo problemas con poblar elementos padre y hijo de la base de datos.
Aquí está mi código para que pueda ver lo que he hecho hasta ahora.
Esto es 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; } }
Y esta es mi clase logsRecapitulation:
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() { } }
Mi problema ahora es poblar ExpendableListView con datos de la base de datos. Aquí están mis clases de mesa:
//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; }
Nota: Estoy usando ActiveAndroid.
Por favor, si alguien sabe cómo rellenar listas extensibles de la base de datos por favor ayuda.
Pregunta: ¿Qué debo hacer para llenar correctamente ExpandableListView de la base de datos?
- ¿Cuál es el uso de BaseColumns en Android
- Android - ¿Cuáles son las buenas herramientas de informes para diseñar y generar informes desde SQLite Data Source?
- ¿Cómo recuperar datos de un cursor en android?
- Comportamiento extraño de la consulta SQLite parametrizada
- SQLite: forma eficiente de eliminar lotes de filas
- Insertar y seleccionar datos en árabe Android SQLite
- Obtener mínimo de la columna de la base de datos SQLite?
- Alternativas de SQLite para Android
No soy un experto en ActiveAndroid.But aquí están los pasos para crear una lista expandible usando el cursor.
Necesita dos métodos en la clase auxiliar de db para recopilar las filas que necesitará.
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); }
A continuación, debe configurar el adaptador (en su actividad):
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; } }
Y, finalmente, llame al adaptador y configúrelo a su lista (en su actividad):
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. } }
Así que todos juntos código
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 } }
Si desea capturar el evento de clic en group / child, entonces maneje eventos:
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; } });
- ¿Cómo capturar eventos claves dentro de un servicio?
- Depuración de nivel de código fuente de Android en Eclipse