繁体   English   中英

空白ListView在Logcat中没有错误-Android和自定义适配器

[英]Blank ListView with no errors in Logcat - Android & custom adapter

我一直在尝试创建一个显示事件项目的listView,只是它没有显示任何内容。 我几乎只是遵循示例。 我的dq.getAllEventsCategory()方法返回事件项的数组列表。

这是我的活动:

public class CategoryActivity extends ActionBarActivity {
DatabaseQueries dq = new DatabaseQueries(this);
private ArrayList<Event> eventDetails;
public String typeSearchTerm;




@Override
public void onCreate(Bundle savedInstanceState)  {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_category);


    Intent i = getIntent();
   typeSearchTerm = i.getStringExtra(String.valueOf(R.string.event_type_extra));



    //TRY TO FILL THE ARRAYLIST WITH ALL EVENTS
    DatabaseQueries dq = new DatabaseQueries(this);
    try {
        //eventDetails = dq.getAllEventsCategory(typeSearchTerm);
        eventDetails = dq.getAllEvents();
        Log.d("ARRAY SIZE", eventDetails.size() + "");
        Date d = new Date();
       // Event e = new Event("BBQ", "bottle cap",d, "This is an event", "www.google.com", d, d );
       // eventDetails.add(e);
       // Log.d("Array Size after", eventDetails.size() + "");
    } catch (ParseException e) {
        e.printStackTrace();
    }


    final ListView lv1 = (ListView)findViewById(R.id.categoryListView);

    lv1.setAdapter(new eventItemAdapter(this, eventDetails));

    lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> a, View v, int position, long id) {
            Object o = lv1.getItemAtPosition(position);
            Event objEvent = (Event)o;
            Toast.makeText(CategoryActivity.this, "You have chosen : " + " " + objEvent.getEventName(), Toast.LENGTH_SHORT).show();
        }
    });


}}

我的适配器:

public class eventItemAdapter extends BaseAdapter{
    private static ArrayList<Event> eventDetails;
    private LayoutInflater mInflater;
    private static final SimpleDateFormat parser = new SimpleDateFormat("dd/MM/yyyy"); //dd-MM-yyyy
    private static final SimpleDateFormat parseTime = new SimpleDateFormat("hh:mm a");//hh:mm a

    public eventItemAdapter(Context context, ArrayList<Event> results) {
        eventDetails = results;
        mInflater = LayoutInflater.from(context);

    }

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

    @Override
    public Object getItem(int i) {
        return eventDetails.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if(convertView == null){
            convertView =  mInflater.inflate(R.layout.listview_row, null);
            holder = new ViewHolder();
            holder.eventDetailName = (TextView)convertView.findViewById(R.id.eventDetailsName);
            holder.eventDetailLocation = (TextView)convertView.findViewById(R.id.eventDetailsLocation);
            holder.eventDetailDate = (TextView)convertView.findViewById(R.id.eventDetailsDate);
            holder.eventDetailStartTime = (TextView)convertView.findViewById(R.id.eventDetailsStartTime);

            convertView.setTag(holder);
        } else{
            holder = (ViewHolder)convertView.getTag();
        }

        holder.eventDetailName.setText(eventDetails.get(position).getEventName());
        holder.eventDetailLocation.setText(eventDetails.get(position).getEventLocation());
        Date temp = new Date();
        temp = eventDetails.get(position).getEventDate();
        holder.eventDetailDate.setText(parser.format(temp));
        Date tempTime = new Date();
        tempTime = eventDetails.get(position).getEventStartTime();
        holder.eventDetailStartTime.setText(parseTime.format(tempTime));

        //Return the current view
        return convertView;
    }


    static class ViewHolder{
        TextView eventDetailName;
        TextView eventDetailLocation;
        TextView eventDetailDate;
        TextView eventDetailStartTime;
    } }

这是项目视图:

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

    <ImageView
        android:id="@+id/event_photo"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_marginBottom="5dp"
        android:layout_marginLeft="10dp"
        android:layout_marginRight="10dp"
        android:layout_marginTop="10dp"
        android:src="@drawable/ic_launcher" />

    <LinearLayout android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/eventDetailsName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Event Name"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="#33CC33"
            android:layout_marginTop="25dp"
            android:layout_marginBottom="6dp" />

        <TableLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <TableRow
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">

                <TextView
                    android:id="@+id/time"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Time: "
                    android:layout_marginRight="5dp" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="New Text"
                    android:id="@+id/eventDetailsStartTime"
                    android:layout_column="3" />
            </TableRow>

            <TableRow
                android:layout_width="fill_parent"
                android:layout_height="fill_parent">

                <TextView
                    android:id="@+id/date"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Date: "
                    android:layout_marginRight="5dp" />

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="New Text"
                    android:id="@+id/eventDetailsDate"
                    android:layout_column="3" />
            </TableRow>

        </TableLayout>

    </LinearLayout>

    <TableRow
        android:layout_width="wrap_content"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/location"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Location: "
            android:layout_marginRight="5dp" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="New Text"
            android:id="@+id/eventDetailsLocation"
            android:layout_column="3" />
    </TableRow>

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

</LinearLayout>

和实际的ListView:

    <?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">

    <include
        android:id="@+id/app_bar"
        layout="@layout/app_bar" />

    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/categoryListView"/>

</LinearLayout>

编辑:

getAllEventsCategory()的代码:

public ArrayList<Event> getAllEventsCategory(String category) throws ParseException {
    SQLiteDatabase dq = this.getReadableDatabase();
    ArrayList<Event> global = new ArrayList<Event>();


    String query = "SELECT e." + EVENT_ID + ", e." + EVENT_NAME + ", e." + EVENT_SOCIETY_ID + ", e."
            + EVENT_LOCATION + ", e." + EVENT_LINK + ", e." + EVENT_START_TIME + ", e."
            + EVENT_END_TIME + ", et." + EVENT_TYPE + " FROM " + TABLE_EVENT + " e LEFT JOIN "
            + TABLE_HAS_CATEGORY + " h ON e." + EVENT_ID + " = h." + HAS_EVENT_ID
            + " JOIN " + TABLE_EVENT_TYPE + " et ON h." + HAS_EVENT_TYPE_ID + " = et."
            + EVENT_TYPE_ID + " where et." + EVENT_TYPE + " = \"" + category + "\";";

    Log.d("QUERY ", "" + query);

    Cursor cursor = dq.rawQuery(query, null);
    int numRows = cursor.getCount();

    //for loop to add each event to the arraylist
    for (int i = 0; i < numRows; i++) {
        Event e = new Event();

        e.setEventID(Integer.parseInt(cursor.getString(0)));
        e.setEventName(cursor.getString(1));
        e.setSocietyID(Integer.parseInt(cursor.getString(2)));
        e.setEventLocation(cursor.getString(4));

        String myDate = cursor.getString(5);
        e.setEventDate(parser.parse(myDate));
        e.setEventDescription(cursor.getString(6));
        e.setEventLink(cursor.getString(7));


        String myStartTime = cursor.getString(8);
        e.setEventStartTime(parseTime.parse(myStartTime));

        String myEndTime = cursor.getString(9);
        e.setEventEndTime(parseTime.parse(myEndTime));


        global.add(e);


        if (i < numRows) {

            cursor.moveToPosition(i + 1);
        }

        if (i > numRows) {
            cursor.moveToFirst();
        }


    }
    return global;
}

我也尝试了没有特定类别的搜索(就像仅使用我的getAllEvents方法返回的arraylist一样),但是我仍然遇到空指针异常。 我在getAllEvents中得到一个空指针异常,在getAllEventsCategory中得到一个空/空白列表视图

getAllEvents()方法:

public ArrayList<Event> getAllEvents() throws ParseException {
    SQLiteDatabase dq = this.getReadableDatabase();
    ArrayList<Event> global = new ArrayList<Event>();




    Log.d("QUERY ", "" + query);

    Cursor cursor = dq.rawQuery(query, null);
    int numRows = cursor.getCount();
    cursor.moveToFirst();

   if(cursor.moveToFirst()){
       cursor.moveToFirst();
       //for loop to add each event to the arraylist
       for (int i = 0; i < numRows; i++) {
           Event e = new Event();

           e.setEventID(Integer.parseInt(cursor.getString(0)));
           e.setEventName(cursor.getString(1));
           e.setSocietyID(Integer.parseInt(cursor.getString(2)));
           e.setEventLocation(cursor.getString(3));

           String myDate = cursor.getString(4);
           e.setEventDate(parser.parse(myDate));
           e.setEventDescription(cursor.getString(5));
           if(cursor.getString(6) != null) {
               e.setEventLink(cursor.getString(6));
           }else{
               e.setEventLink("");
           }

           String myStartTime = cursor.getString(7);
           e.setEventStartTime(parseTime.parse(myStartTime));

           Date date = new Date();
           date.setTime(0);

           if(cursor.getString(8) != null){
               String myEndTime = cursor.getString(8);
               e.setEventEndTime(parseTime.parse(myEndTime));
           }else{
               e.setEventEndTime(date);
           }



           global.add(e);


           if (i < numRows) {

               cursor.moveToPosition(i + 1);
           }

           if (i > numRows) {
               cursor.moveToFirst();
           }


       }

   }else{
       Log.d("Results", "no results");
   }
    Log.d("Array size", "" + global.size());
    return global;
}

是我的日志。 d日志“数组大小”是应作为lv1.setAdapter()方法的参数的数组大小

首先,在使用列表视图时,您必须考虑以下几点,

  • 列表项视图的高度应为“ wrap_content” 。如果将其设置为“ match_parent”,则第一行将占用设备上的所有空间,其余行将没有空间。

  • Listview的高度应为“ match_parent” 。如果将其设置为“ wrap_content”,则不会使用列表视图的回收概念,因为它将第一次创建所有viewview的行作为listview显示。它还会影响listview的滚动并消耗很多内存。

您为Java类中的listview使用了错误的ID。XML中的listview id为“ listViewCategory ”,而在Java类中使用的listview id为“ categoryListView ”。

还有一点是,请确保setAdapter()时数组(eventDetails)中必须有项目。

您解决了问题吗? 我发现您已在项目视图中的表格布局之外放置了表格行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM