Populate ListView with an arrayList with d

2019-06-05 17:19发布

问题:

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.

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

回答1:

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


回答2:

You can use SimpleAdapter :

ListView list = (ListView) findViewById(R.id.mylist);
ArrayList<HashMap<String, String>> mylistData =
               new ArrayList<HashMap<String, String>>();

String[] columnTags = new String[] {"col1", "col2", "col3"};

int[] columnIds = new int[] {R.id.column1, R.id.column2, R.id.column3};
for(int i=0; i<3; i++)
{
HashMap<String,String> map = new HashMap<String, String>();
 //initialize row data
 for(int j=0; j<3; j++)
 {
   map.put(columnTags[j], "row”+i+”col"+j);
 }
 mylistData.add(map);
 }
 SimpleAdapter arrayAdapter =
           new SimpleAdapter(this, mylistData, R.layout.mylistrow,
                         columnTags , columnIds);
 list.setAdapter(arrayAdapter);

Or use CustomAdapter

import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;


public class MainActivity extends Activity {

    ListView l1;
    String[] t1={"video1","video2"};
    String[] d1={"lesson1","lesson2"};
    int[] i1 ={R.drawable.ic_launcher,R.drawable.ic_launcher};


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        l1=(ListView)findViewById(R.id.list);
        l1.setAdapter(new dataListAdapter(t1,d1,i1));
    }

    class dataListAdapter extends BaseAdapter {
        String[] Title, Detail;
        int[] imge;

        dataListAdapter() {
            Title = null;
            Detail = null;
            imge=null;
        }

        public dataListAdapter(String[] text, String[] text1,int[] text3) {
            Title = text;
            Detail = text1;
            imge = text3;

        }

        public int getCount() {
            // TODO Auto-generated method stub
            return Title.length;
        }

        public Object getItem(int arg0) {
            // TODO Auto-generated method stub
            return null;
        }

        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {

            LayoutInflater inflater = getLayoutInflater();
            View row;
            row = inflater.inflate(R.layout.custom, parent, false);
            TextView title, detail;
            ImageView i1;
            title = (TextView) row.findViewById(R.id.title);
            detail = (TextView) row.findViewById(R.id.detail);
            i1=(ImageView)row.findViewById(R.id.img);
            title.setText(Title[position]);
            detail.setText(Detail[position]);
            i1.setImageResource(imge[position]);

            return (row);
        }
    }
}


回答3:

You can use SimpleCursorAdapter for this.

Here is some example (see full example):

public static final String KEY_APPLES = "apples";
public static final String KEY_PRICE = "Price";
public static final String KEY_TYPE = "Type";

private void displayListView() {

    Cursor cursor;
    SimpleCursorAdapter dataAdapter; //android.support.v4.widget.SimpleCursorAdapter;

    //Put your code to get cursor

    // The desired columns to be bound
    String[] columns = new String[]{
            KEY_APPLES,
            KEY_PRICE,
            KEY_TYPE
    };

    // the XML defined views which the data will be bound to
    int[] to = new int[]{
            R.id.apples,
            R.id.price,
            R.id.type
    };

    // create the adapter using the cursor pointing to the desired data
    //as well as the layout information
    dataAdapter = new SimpleCursorAdapter(
            this, R.layout.country_info,
            cursor,
            columns,
            to,
            0);

    ListView listView = (ListView) findViewById(R.id.listView);
    // Assign adapter to ListView
    listView.setAdapter(dataAdapter);

}