Android 在ListView中显示多个数据

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

我是android新手。我想将从
数据库
获取的数据显示到
列表视图

现在我只能显示一个数据。 如何在自定义
列表视图中显示多个数据

这是我的主要活动。课堂

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