Search code examples
javaandroidlistviewarraylistcursor

Populate ListView with an arrayList<String> with data obtained from a cursor


Helo i am trying to populate a listView with data stored in a sqLite. After i select a product i want all the reference of that product to go on the same line like i drew in the picture. enter image description here

Can i make the ArrayAdapter put all records in the same xml?

My code looks like this: The cursor that returns all records:

public Cursor getAllRows() {
    String where = null;

    // query the DBAdapter
    Cursor cursor = db.query(true, TABLE_NAME, ALL_KEYS, where, null, null, null, null, null);
    if (cursor != null) {
        cursor.moveToFirst();
    }
    return cursor;
}

Adding data to arrayList:

    public ArrayList<String> fromCursorToArrayListString(Cursor c){
    ArrayList<String> result = new ArrayList<String>();
    c.moveToFirst();
    for(int i = 0; i < c.getCount(); i++){

        String row_PRODUCT = c.getString(c.getColumnIndex(KEY_PRODUCT));
        String row_PRICE = c.getString(c.getColumnIndex(KEY_PRICE));
        String row_TYPE = c.getString(c.getColumnIndex(KEY_TYPE));

        result.add(row_PRODUCT);
        result.add(row_PRICE);
        result.add(row_TYPE);
        c.moveToNext();
    }
    return result;
}

In the mainActivity i wrote this:

ListView listView = (ListView) findViewById(R.id.new_list_listView);
Cursor cursor = newListDBAdapter.getAllRows();
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,R.layout.custom_product_layout_new_list,R.id.custom_product_layout_new_list_productName,newListDBAdapter.fromCursorToArrayListString(cursor));
listView.setAdapter(arrayAdapter);

Solution

  • CursorAdapter adapter more reliable for this . you just pass your Cursor to adapter so you no need to maintain any collection . you must follow few things

    Adapter

     public class YourCursorAdapter extends CursorAdapter {
          public YourCursorAdapter(Context context, Cursor cursor, int flags) {
              super(context, cursor, 0);
          }
    
          // The newView method is used to inflate a new view and return it, 
          // you don't bind any data to the view at this point. 
          @Override
          public View newView(Context context, Cursor cursor, ViewGroup parent) {
              return LayoutInflater.from(context).inflate(R.layout.your_item_view, parent, false);
          }
    
          // The bindView method is used to bind all data to a given view
          // such as setting the text on a TextView. 
          @Override
          public void bindView(View view, Context context, Cursor c) {
              // Find fields to populate in inflated template
              TextView tvproduct = (TextView) view.findViewById(R.id.tcproduct);
              TextView tvPrice = (TextView) view.findViewById(R.id.tvPrice);
              TextView tvType = (TextView) view.findViewById(R.id.tvType);
              // Extract properties from cursor
              String row_PRODUCT = c.getString(c.getColumnIndex(KEY_PRODUCT));
            String row_PRICE = c.getString(c.getColumnIndex(KEY_PRICE));
            String row_TYPE = c.getString(c.getColumnIndex(KEY_TYPE));
    
              // Populate fields with extracted properties
              tvproduct.setText(row_PRODUCT);
               tvPrice.setText(row_PRICE);
               tvType.setText(row_TYPE);
    
          }
        }
    

    Retrieve the record from DB

    public Cursor getAllRows() { String where = null;

    // query the DBAdapter
    Cursor cursor = db.query(true, TABLE_NAME, ALL_KEYS, where, null, null, null, null, null);
    if (cursor != null) {
        cursor.moveToFirst();
    }
    return cursor;
    

    }

    Now set cursor to your adapter ,adapter set to listview

    ListView listView = (ListView) findViewById(R.id.new_list_listView);
    Cursor cursor = newListDBAdapter.getAllRows();
    YourCursorAdapter  arrayAdapter = new YourCursorAdapter(this, cursor); 
    listView.setAdapter(arrayAdapter );