将ArrayList <object>添加到listview -android

时间:2016-10-25 06:18:41

标签: android listview arraylist

在我的android项目中, 我正在获取arraylist中的数据列表

ArrayList<Items> item = db.getAllMenu();

但现在我想将这些数据添加到listview中, 我试过,

ListView lv=(ListView)findViewById(R.id.list_view_inside_nav);
String[] lv_arr = {};
         lv_arr = (String[]) item.toArray();
        lv.setAdapter(new ArrayAdapter<String>(MainActivity.this,
                android.R.layout.simple_list_item_1, lv_arr));

但它给出错误。因为我试图将arratlist转换为字符串.. 任何人PLZ帮助我,如何将arraylist转换为字符串[]

这是我的一些文件...... items.java(getter和setter方法)

public class Items {
    //private variables

    String _name;
    // Empty constructor
    public Items(){
    }

    // constructor
    public Items(String name){

        this._name = name;

    }

    // getting name
    public String getName(){
        return this._name;
    }
    // setting name
    public void setName(String name){
        this._name = name;
    }


}

我正在使用此代码从数据库中获取数据

public ArrayList<Items> getAllMenu() {
    ArrayList<Items> passList = new ArrayList<Items>();
    // Select All Query
    String selectQuery = "SELECT * FROM " + CATEGOTY_TABLE_NAME;
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor cursor = db.rawQuery(selectQuery, null);
    // looping through all rows and adding to list
    if (cursor.moveToFirst()) {
        do {
            Items menu = new Items();

            menu.setName(cursor.getString(0));

    // Adding category to list
            passList.add(menu);
        } while (cursor.moveToNext());
    }
    // return category list
    return passList;
}

4 个答案:

答案 0 :(得分:0)

错误。 Items类无法转换为String类。 您需要将每个Items转换为String对象。

示例:

说出你的课程项目

class Items{
    public String itemName;
}

在您的代码更改中

String[] lv_arr = new String[items.size()];

for(int i=0;i<items.size();i++){
    lv_arr[i]=item.get(i);
}

lv.setAdapter(new ArrayAdapter<String>(MainActivity.this,
            android.R.layout.simple_list_item_1, lv_arr));

答案 1 :(得分:0)

你的问题是你正在尝试将List转换为数组,这不能通过强制转换完成,但存在方法。

最简单的方法是使用List.toArray(E [])方法将列表转换为数组。

ArrayList<Items> items = db.getAllMenu();
Items[] itemsArray = new Items[items.size()]; //Create the array to the correct size, 
itemsArray = items.toArray(itemsArray); //Fill the array with the list data
//you could cast into Item[] directly but this is cleaner

在此处使用帮助:Convert ArrayList<String> to String[] array

数组必须是项目数组

然后,如果您已覆盖Item类的toString方法,则返回您想要的String。

public class Items {
   ...

   @Override
   public String toString(){ 
       this.getName() //Just an example ;)
   }
   ...
}

这将像一个魅力。适配器使用此方法来获取要打印的String。

编辑:

经过一些研究,您甚至不需要创建数组。 ArrayAdapter接受List,因此您只需覆盖Items.toString()

https://developer.android.com/reference/android/widget/ArrayAdapter.html

您可以在此处看到需要覆盖toString

  

但是引用了TextView,它将填充数组中每个对象的toString()。您可以添加自定义对象的列表或数组。覆盖对象的toString()方法,以确定将为列表中的项显示的文本。

这是使用

的构造函数
  

ArrayAdapter(上下文上下文,                   int资源,                   列出对象)

所以只需像这样创建你的适配器:

new ArrayAdapter<Items>(MainActivity.this,
            android.R.layout.simple_list_item_1, item);

答案 2 :(得分:0)

你必须让对象的arraylist做这样的事情,这是我使用的一段代码

我的ArrayList

private ArrayList<Mediafileinfo> songList = new ArrayList<Mediafileinfo>();

在arraylist对象中添加数据。

  Mediafileinfo info = new Mediafileinfo();
                    info.setFile_uri(Uri.parse(audioCursor.getString(audiodata)));
                    info.setName(audioCursor.getString(audioTitle));
                    info.setDuration(audioCursor.getLong(audioduration));
                    info.setAlbum(audioCursor.getString(audioalbum));
                   info.setAlbum_Art_uri(ContentUris.withAppendedId(albumArtUri, audioCursor.getLong(audioalbumid)));
                    songList.add(info);

使用getter和setter创建一个类

public class Mediafileinfo {
private String name,album,artist;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getAlbum() {
    return album;
}

public void setAlbum(String album) {
    this.album = album;
}

public String getArtist() {
    return artist;
}

public void setArtist(String artist) {
    this.artist = artist;
}
}

然后像你一样调用你的arraylist适配器

 Mediafileinfo mediafileinfo = (Mediafileinfo) getItem(position);
    TextView textView = (TextView) view.findViewById(R.id.textView);
    textView.setText(mediafileinfo.getAlbum());

和休息将是一样的 您可以像这样设置适配器中的arraylist

new CustomAdapter(this,songlist) 希望这会对你有帮助。For more info

答案 3 :(得分:0)

let listobj是要为listView设置的对象的列表,Lv是listview 使用以下代码:

 LV.setAdapter(new ArrayAdapter<>(getContext(),android.R.layout.simple_list_item_1 ,sensors));


更新

如果您希望LisView的每个项目都代表一个特定的对象,则还可以使用这样的自定义适配器填充它: 首先在Java文件中定义扩展BaseAdaptor的新Java类

public class SensorAdaptor extends BaseAdapter{
    private final Context context;
    private final List<Sensor> sensors;

    public SensorAdaptor(Context context , List<Sensor> sensors){
        this.context = context;
        this.sensors = sensors;
    }

    @Override
    public int getCount() {
        return sensors.size();
    }

    @Override
    public Object getItem(int position) {
        return sensors.get(position);
    }

    @Override
    public long getItemId(int position) {
        return sensors.get(position).getType();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view;
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
            view = inflater.inflate(R.layout.list_sensors, null);
        } else {
            view = convertView;
        }
        TextView listName = view.findViewById(R.id.txtSensorList);
        listName.setText(sensors.get(position).getName());
        return view;
    }
}

在我的情况下,我希望listView的每个项目都代表一个Sensor对象 然后在res / layout的布局文件中定义此适配器要使用的布局

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/**txtSensorList**"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:text="TextView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>

然后您的活动

List<Sensor> sensors = mgr.getSensorList(Sensor.TYPE_ALL);


LV.setAdapter(new SensorAdaptor(getContext(),sensors));

注意 在我的情况下,我想显示传感器对象的列表