【发布时间】:2015-05-11 10:56:21
【问题描述】:
我一直在尝试创建一个显示事件项的 listView,但它没有显示任何内容。我几乎只是遵循this 的例子。我的 dq.getAllEventsCategory() 方法返回一个事件项的 Arraylist。
这是我的活动:
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 方法返回的数组列表一样),但我仍然遇到空指针异常。我用 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;
}
This 是我的日志猫。 d log "Array size" 是数组的大小,应该是 lv1.setAdapter() 方法的参数
【问题讨论】:
-
当你说它没有显示任何东西时,你是什么意思?屏幕只是黑的吗?您告诉我们的越多,我们帮助您的机会就越大。
-
请检查您的 'eventDetails' 大小 (System.out.println(eventDetails.size();)
-
不是黑色的,它只是显示一个像this这样的空白屏幕
-
@Vladimir 好的。好吧,这可能解释了它。我的 getAllEventsCategory 方法返回一个空数组列表。如果 arraylist 不为空,它是否还应该显示一些东西?或者我的代码有问题
-
@vn2456 在我看来代码很好,问题出在 'getAllEventsCategory()'
标签: java android listview android-listview baseadapter