2016-05-30 20 views
5

Ho tabelle Ricevute e registri e la ricevuta di una tabella contiene molti registri. Quindi sul mio LogsRecapitulation.class ho i registri di raggruppamento per ordinamento e grado (quelle due colonne provengono dai registri tabella).Popolamento EspandibileListView dal database - non funzionante

Ho provato a farlo tramite ExpandableListView. Ogni gruppo di elementi padre dei registri sarà composto da Ordina e Grado per ciascun gruppo dal database.

Gli elementi dei bambini avranno le viste di testo per i conteggi relativi all'elemento figlio, alla massa, al prezzo e al prezzo calcolato. E dovrebbe essere simile a questa: i layout expandableListView

enter image description here

ho creato e l'adattatore. Ma ora ho problemi con il popolamento di elementi padre e figlio dal database.

Ecco il mio codice in modo da poter vedere quello che ho fatto finora.

Questa è classe expandableListAadapter:

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; 
    } 
} 

e questa è la mia classe 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() { 

    } 
} 

mio problema ora è popolare ExpendableListView con i dati dal database. Ecco i miei corsi di tabella:

//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: sto usando ActiveAndroid.

Per favore, se qualcuno sa come compilare listView espandibile dal database, per favore aiutatemi.

Domanda: Cosa devo fare per compilare EspandibileListView dal database?

risposta

2

Io non sono un esperto di ActiveAndroid. Ma qui ci sono i passaggi per creare un expandablelistview usando il cursore.

Sono necessari due metodi nella classe db helper per raccogliere le righe necessarie.

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); 
} 

quindi è necessario configurare l'adattatore (in attività):

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; 
    } 
} 

E, infine, chiamare l'adattatore e configurarlo per l'elenco (in attività):

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. 
    } 
} 

Così tutti insieme codice

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 
    } 
} 

Se si desidera catturare evento click sul gruppo/bambino poi gestire gli eventi:

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

Grazie per la risposta, cercherò implementare questa in ActiveAndroid e ti faccio sapere era io successo. – RubyDigger19