Android 在ListView中显示多个数据
我是android新手。我想将从Android 在ListView中显示多个数据,android,listview,android-listview,Android,Listview,Android Listview,我是android新手。我想将从数据库获取的数据显示到列表视图 现在我只能显示一个数据。 如何在自定义列表视图中显示多个数据 这是我的主要活动。课堂 DatabaseHandler db = new DatabaseHandler(this); /** * CRUD Operations * */ Log.d("Reading: ", "Reading all contacts.."); List <AllItem> allIt
数据库
获取的数据显示到列表视图
现在我只能显示一个数据。
如何在自定义列表视图中显示多个数据
这是我的主要活动。课堂
DatabaseHandler db = new DatabaseHandler(this);
/**
* CRUD Operations
* */
Log.d("Reading: ", "Reading all contacts..");
List <AllItem> allItems = new ArrayList<AllItem>();
allItems = db.getAllAccommodations();
ArrayList <String> allItems2 = new ArrayList<String>();
for (AllItem cn : allItems) {
allItems2.add(cn.getItem_name());
allItems2.add(cn.getAreaNAme());
}
ArrayAdapter <String> adapter = new ArrayAdapter <String> (this, android.R.layout.simple_list_item_1,allItems2);
listview.setAdapter(adapter);
acoloyout.xml
<ListView
android:id="@+id/listAccommodation"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="8"
android:layout_marginLeft="7dip"
android:layout_marginRight="7dip"
android:background="@color/white"
android:divider="@color/black90"
android:dividerHeight="5.0sp"
android:listSelector="@color/black30" >
</ListView>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="10dip"
android:paddingTop="10dip"
android:paddingBottom="10dip" >
<TextView
android:id="@+id/item_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/area_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="14sp"
android:layout_below="@+id/item_name" />
</RelativeLayout>
有人能帮我吗?把这当作你的光标:在你从数据库获取数据之后
Cursor mCur = db.getAllAccommodations();
在onCreate中:
CurAdapter Cur = new CurAdapter(getActivity(), mCur,0);
final ListView lv = (ListView)findViewById(R.id.listAccommodation);
lv.setFastScrollEnabled(true);
lv.setAdapter(Cur);
然后创建一个子类:
private class CurAdapter extends CursorAdapter{
public CurAdapter(Context context, Cursor c, int flags) {
super(context, c, flags);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
TextView tv = (TextView) view.findViewById(R.id.item_name);
TextView tv1 = (TextView) view.findViewById(R.id.area_name);
String item = (cursor.getString(cursor.getColumnIndexOrThrow("ColumnName1")));
String area = dateConvert(cursor.getString(cursor.getColumnIndexOrThrow("ColumnName2")));
tv1.setText(item);
tv.setText(area);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view = LayoutInflater.from(context).inflate(R.layout.AccoLayout, null);
return view;
}
}
其中R.layout.AccoLayout是您的“listview行”布局,例如:
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="10dip"
android:paddingLeft="10dip"
android:paddingTop="10dip" >
<TextView
android:id="@+id/item_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/area_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/item_name"
android:textSize="14sp" />
</RelativeLayout>
您需要为此创建CustomAdapter类。
按原样使用listview
<ListView
android:id="@+id/listAccommodation"
android:layout_width="match_parent"
android:layout_height="0dip"
android:layout_weight="8"
android:layout_marginLeft="7dip"
android:layout_marginRight="7dip"
android:background="@color/white"
android:divider="@color/black90"
android:dividerHeight="5.0sp"
android:listSelector="@color/black30" >
</ListView>
下面是CustomAdapter类
public class ListAdapter extends BaseAdapter {
public ListAdapter(Activity a, List <AllItem> allItems) {
activity = a;
data = d;
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
return data.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
if (convertView == null)
vi = inflater.inflate(R.layout.AccoLayout, null);
TextView itemName = (TextView)vi.findviewById(R.id.item_name);
TextView areaName = (TextView)vi.findviewById(R.id.area_name);
// Set your data here
itenName.setText(data.get(position));//like this
return vi;
}
公共类ListAdapter扩展了BaseAdapter{
公共ListAdapter(活动a,列表所有项){
活动=a;
数据=d;
充气器=(充气器)活动
.getSystemService(上下文布局\充气机\服务);
}
public int getCount(){
返回data.size();
}
公共对象getItem(int位置){
返回位置;
}
公共长getItemId(int位置){
返回位置;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
视图vi=转换视图;
if(convertView==null)
vi=充气机充气(R.layout.Accoot,空);
TextView itemName=(TextView)vi.findviewById(R.id.item_name);
TextView区域名称=(TextView)vi.findviewById(R.id.area\u名称);
//在这里设置数据
itenName.setText(data.get(position));//像这样
返回vi;
}
}我假设您的allItems2列表具有类似itemName0、areaName0、itemName1、areaName1、itemName2的模式。。然后,您可以编写这样的自定义适配器
public class CustomAdapter extends ArrayAdapter<String> {
private final Activity context;
private final List<String> items;
public CustomAdapter (Activity context, List<String> items) {
super(context, R.layout.AccoLayout, items);
this.context = context;
this.items= items;
}
@Override
public View getView(final int position, View view, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.AccoLayout, null, true);
TextView itemName = (TextView) rowView.findViewById(R.id.item_name);
TextView areaName= (TextView) rowView.findViewById(R.id.area_name);
itemName.setText(items.get(2*position));
areaName.setText(items.get(2*position + 1));
return rowView;
}
此外,根据Android的惯例,尽量不要在XML文件名中使用大写字母,以避免任何复杂情况。您可以更改为acco_layout.xml。您最好的选择是使用光标适配器,而不必丢失through@Matthew看看这里,我已经详细描述了如何将数据库中的多条记录显示到listview中@拜占庭童话你有什么好的例子或教程的链接吗?我曾经尝试过使用游标适配器,但我不知道如何使用它。您想在一个列表视图中显示allItems list和allItems2 list,其每一行都是两个文本字段的布局,对吗?如果是这样,我可以用一个自定义适配器来帮助您。@FarukYazıcı我只想在列表视图中显示allItems2
。你真的能帮我吗?只需一个简单的就可以了。子类用于处理自定义适配器?子类将处理您的循环和所有事情!对不起,我问得太多了。好的,我试试看。谢谢你的回答:谢谢你的ans,我会试试:Dhi@Sandip,我在ListAdapter
like活动上出错,无法解析为变量。非常感谢@Faruk Yazici。它起作用了。但是,如果我有更多的N 2列呢?例如itemname、areaname、address、price
。我只是需要使用(2*position+2)等吗?不,如果你有三个值,它们将是(3*pos),(3*pos+1),(3*pos+2),如果你有四列(4*pos),(4*pos+1),(4*pos+2),(4*pos+3)是的,我在尝试之后才得到它:但我建议你使用一个对象列表。它将更加整洁,您只需通过一个位置索引即可到达每个项目:)谢谢@FarukYazıcı,我使用了这个自定义类,它工作得很好。但是,我得到一个致命错误无效索引6,长度为6
。调试时,所有值均符合预期,并且items.get(2*position+1)中的索引似乎正确代码>等。有什么想法吗?
public class ListAdapter extends BaseAdapter {
public ListAdapter(Activity a, List <AllItem> allItems) {
activity = a;
data = d;
inflater = (LayoutInflater) activity
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public int getCount() {
return data.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
View vi = convertView;
if (convertView == null)
vi = inflater.inflate(R.layout.AccoLayout, null);
TextView itemName = (TextView)vi.findviewById(R.id.item_name);
TextView areaName = (TextView)vi.findviewById(R.id.area_name);
// Set your data here
itenName.setText(data.get(position));//like this
return vi;
}
public class CustomAdapter extends ArrayAdapter<String> {
private final Activity context;
private final List<String> items;
public CustomAdapter (Activity context, List<String> items) {
super(context, R.layout.AccoLayout, items);
this.context = context;
this.items= items;
}
@Override
public View getView(final int position, View view, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.AccoLayout, null, true);
TextView itemName = (TextView) rowView.findViewById(R.id.item_name);
TextView areaName= (TextView) rowView.findViewById(R.id.area_name);
itemName.setText(items.get(2*position));
areaName.setText(items.get(2*position + 1));
return rowView;
}
CustopAdapter adapter = new CustomAdapter (MainActivity.this, allItems2);
listview.setAdapter(adapter);