从ArrayList <object>检索数据到Listview Android

时间:2016-03-31 17:05:48

标签: android listview

我的ListView有问题,我无法将数据从arraylist获取到listview。来自arraylist的数据从数据中成功加载,当我将它放入ArrayAdapter时,应用程序总是说ArrayAdapter要求资源ID为TextView 这是我的代码

EventList.java

public class EventList extends Activity {
    ListView listView;
    DBHelper db;
    List<String> event_name;
    private TextView e_name,e_location,e_date,e_time,e_or;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event_list);
        db = new DBHelper(this);
        listView = (ListView) findViewById(R.id.eventlist);
        db.open();
        ArrayList<Event> elist= db.getEventlist();
        db.close();
        e_name=(TextView) findViewById(R.id.e_name);
        e_date=(TextView) findViewById(R.id.e_date);
        e_location =(TextView) findViewById(R.id.e_location);
        e_time =(TextView) findViewById(R.id.e_time);
        e_or =(TextView) findViewById(R.id.e_or);
      //  for(int i=0;i<elist.size();i++)
    //    {
     //       e_name.setText(elist.get(i).getEventName());
       //     e_date.setText(elist.get(i).getDate());
    //        e_location.setText(elist.get(i).getLocation());
      //      e_time.setText(elist.get(i).getTime());
        //    e_or.setText(elist.get(i).getOrganizer());

      //  }
        ArrayAdapter<Event> arrayAdapter = new ArrayAdapter<Event>(
                this,
                R.layout.each_event,elist);
        listView.setAdapter(arrayAdapter);


    }

}

activity_event_list.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.greenwich.thaotb.eventmanagement.EventList">
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"

    />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="Event List"
        android:id="@+id/textView2"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Event"
        android:id="@+id/textView3"
        android:layout_marginTop="26dp"
        android:layout_below="@+id/textView2"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:text="Event"
        android:ems="10"
        android:id="@+id/event_name"
        android:layout_alignBottom="@+id/textView3"
        android:layout_toRightOf="@+id/textView3"
        android:layout_toEndOf="@+id/textView3"
        android:layout_marginLeft="33dp"
        android:layout_marginStart="33dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Search"
        android:id="@+id/bnt_search"
        android:layout_below="@+id/event_name"
        android:layout_alignRight="@+id/event_name"
        android:layout_alignEnd="@+id/event_name" />

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/eventlist"
        android:layout_below="@+id/bnt_search"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:choiceMode="singleChoice" />




</RelativeLayout>

each_event.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">


    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/e_name" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/e_location" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/e_date" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/e_time" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="Medium Text"
        android:id="@+id/e_or" />
</LinearLayout>

3 个答案:

答案 0 :(得分:0)

查看您正在使用的constructor for ArrayAdapter的文档。它说资源ID必须是带有TextView的布局。事实证明,在这种情况下,布局必须只包含一个TextView。如果你有不同的情况,请使用不同的构造函数。

ArrayAdapter通过获取其数组中对象的toString()值,然后将其放入由您传递的布局标识的TextView中来填充ListView。

答案 1 :(得分:0)

两个问题

  1. 您无法使用ArrayAdapter构造函数来显示任何复杂的数据对象。它只会toString所有对象。
  2. 从活动中调用findViewById(R.id.e_name)(和其他人)将返回null,因为@+id/e_name不是来自activity_event_list.xml文件。
  3. 要解决这些问题,您需要implement a custom ArrayAdapter来处理您的事件对象。

    像这样的东西

    public class EventAdapter extends ArrayAdapter<Event> {
        public EventAdapter(Context context, ArrayList<Event> events) {
           super(context, 0, events);
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
           // Get the data item for this position
           Event event = getItem(position);    
           // Check if an existing view is being reused, otherwise inflate the view
           if (convertView == null) {
              convertView = LayoutInflater.from(getContext()).inflate(R.layout.each_event, parent, false);
           }
    
           TextView eName = (TextView) convertView.findViewById(R.id.e_name);
           // get other views ...
    
           eName.setText(event.getEventName());
           // set other views...
    
           return convertView;
       }
    }
    

    然后在活动中,您可以

    ArrayList<Event> elist= db.getEventlist();
    EventAdapter adapter = new EventAdapter(this, elist);
    listView.setAdapter(adapter);
    

答案 2 :(得分:0)

我已阅读您的代码,我认为首先要检查ListViewsAdapters如何协同工作。这是一个很棒的article我认为你应该看看。

解决方案

你可以通过

实现你想要的
  • 创建一个代表一个事件的自定义类,它应该是这样的

    class Event{
        private String mName;
        private String mLocation;
        private String mDate;
        //you get the idea ...
        public Event (String name, String location, String date){
            mName = name;
            mLocation = location;
            mDate = date;
        }
        //some getters
        public String getName (){
            return mName;
        }
        public String getLocation (){
            return mLocation;
        }
        public String getDate (){
            return mDate;
        }
        //you can add other logic here depending on what you want your event to do
    }
    
  • 创建Events的集合,List<Event>

  • 创建自定义EventAdapter,我建议扩展BaseAdapter类(任何其他适配器类都可以)

教程可能会为您提供更多帮助

Here is一个很好的分步教程,展示了如何实现我上面提到的内容。