[英]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.