可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
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);
}