2012-08-09 82 views
0

我真的堅持這一點,不能前進我試圖將谷歌日曆事件填充到列表視圖中,並沒有看到任何結果。我很抱歉發佈這樣冗長的代碼,但我真的被卡住了! 我的活動ListView無法加載數據

public class EventListActivity extends Activity { 

private List<Events> events = new ArrayList<Events>(); 
private Handler handler = new Handler(); 
    private ProgressDialog progressBar; 
    private SelectableEventsAdapter eventsAdapter; 

@Override 
public void onCreate(Bundle savedInstance) { 
    super.onCreate(savedInstance); 
    getAccount(); 
    setContentView(R.layout.layout_main); 
    setEventsListView(); 
} 

private void setEventsListView() { 
    Log.i("ReachedsetEvents", "Reached set Events view 1"); 
    final ListView eventsListView = (ListView) findViewById(R.id.list_main); 
    eventsAdapter = new SelectableEventsAdapter(this, events); 
    //eventsAdapter.getView(0, eventsListView, eventsListView); 
    eventsAdapter.setAdapter(eventsAdapter); 
    Log.i("ReachedsetEvents", "Reached set Events view 2"); 
    eventsAdapter.sort(); 

    private void retrieveEvents() { 
    // Retrieves the attendees on a separate thread. 
    new Thread(new Runnable() { 

     public void run() { 

     EventsRetriever eventsRetriever = 
      new EventsRetriever(EventListActivity.this, OAuthManager.getInstance() 
       .getAccount()); 
     final List<Events> newevents = eventsRetriever.getEvents(); 
     Log.i("reachedRetrieve", "reached retrieve"); 
     // Update the progress bar 
     handler.post(new Runnable() { 

      public void run() { 
      if (newevents != null) { 
       events.clear(); 
       events.addAll(newevents); 

      eventsAdapter.sort(); 
      eventsAdapter.notifyDataSetChanged(); 
      } 

      Log.d(Constants.TAG, "Got attendees, dismissing progress bar"); 
      if (progressBar != null) { 
       progressBar.dismiss(); 
       Log.d(Constants.TAG, "Progress bar should have been dismissed"); 
      } 
      } 
     }); 
     } 
    }).start(); 
    // Show a progress bar while the attendees are retrieved from the phone's 
    // database. 
    progressBar = 
     ProgressDialog.show(this, null, getString(R.string.retrieve_contacts_wait_text), true); 
    } 
      @Override 
    protected void onResume() { 
    super.onResume(); 
    // getAccount(); 
    } 

    /** 
    * Prompt user to choose an account and retrieve attendees from phone's 
    * database. 
    */ 
    private void getAccount() { 
    OAuthManager.getInstance().doLogin(false, this, new OAuthManager.AuthHandler() { 
     public void handleAuth(Account account, String authToken) { 
     if (account != null) { 
      retrieveEvents(); 
     } 
     } 
    }); 
    }} 

我的自定義適配器

public SelectableEventsAdapter(Context context, List<Events> items) { 
     super(context, R.layout.layout_main,items); 
     inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    Events item = getItem(position); 
    LinearLayout eventsView = getView(convertView); 

    setViews(item, eventsView); 
    return eventsView; 
    } 
    private LinearLayout getView(View convertView) { 
     Log.i("Reached", "Reached getView long"); 
     LinearLayout eventsView; 
    if (convertView == null) { 
     eventsView = new LinearLayout(getContext()); 
     inflater.inflate(R.layout.layout_main,eventsView,true); 

    } else { 
     eventsView = (LinearLayout) convertView; 
    } 
    return eventsView; 
    } 
    private void setViews(Events item, LinearLayout eventsView) { 
     setTitleView(item, eventsView); 

     } 
    private void setTitleView(Events item, LinearLayout eventsView) { 
    ListView titleView = (ListView) eventsView.findViewById(R.id.list_main); 
     titleView.setEnabled(true); 
    //titleView.setText(item.title); 

} 

和獲取事件的獵犬:

public EventsRetriever(Activity activity, Account account) { 
    this.activity = activity; 
    this.account = account; 
    } 
    public static final String[] FIELDS = { 
     CalendarContract.Events.TITLE, 
     CalendarContract.Events.DESCRIPTION, 
     CalendarContract.Events.ORGANIZER, 
     CalendarContract.Events.STATUS, 
     CalendarContract.Events.DTSTART, 
     CalendarContract.Events.EVENT_LOCATION, 

     }; 


     public static final Uri CALENDAR_URI = Uri.parse("content://com.android.calendar/calendars"); 

     String[] selectionArgs = new String[] {CalendarServiceBuilder.ACCOUNT_NAME, Constants.ACCOUNT_TYPE, 
       CalendarServiceBuilder.ACCOUNT_NAME}; 


    /** 
    * Get the list of user's contacts. 
    * 
    * @return The list of contacts. 
    */ 
    public List<Events> getEvents() { 
    List<Events> result = new ArrayList<Events>(); 
    ContentResolver cr = activity.getContentResolver(); 
    Cursor cursor = 
     cr.query(CalendarContract.Events.CONTENT_URI, FIELDS,null,null, null); 

    try { 
      if(cursor.getCount() > 0) { 
      while (cursor.moveToNext()) { 
       String title =cursor.getString(cursor.getColumnIndex(
         CalendarContract.Events.TITLE)); 
       String description = cursor.getString(cursor.getColumnIndex(
         CalendarContract.Events.DESCRIPTION)); 
       String organizer = cursor.getString(cursor.getColumnIndex(
         CalendarContract.Events.ORGANIZER)); 
       String status = cursor.getString(cursor.getColumnIndex(
         CalendarContract.Events.STATUS)); 
       String location = cursor.getString(cursor.getColumnIndex(
         CalendarContract.Events.EVENT_LOCATION)); 
       result.add(new Events(title,description,organizer,status,location)); 
       Log.i("Reachedretriever", "Reached retriever"); 
      } 

      }} 
      finally { 
        cursor.close(); 
       } 
     return result; 

     }} 

我無法看到任何東西得到填充屏幕上!也只是爲了讓你知道我使用未經授權的Oauth進行api訪問。 layout_main.xml僅包含一個線性佈局中的ListView。 如果您需要更多信息,請讓我知道。

+0

在您實例化SelectableEventsAdapter的地方,您是否已經過雙重檢查以確保您的事件列表不是空的? – Nick 2012-08-09 16:04:50

+0

你的代碼:final ListView eventsListView =(ListView)findViewById(R.id.list_main); eventsAdapter = new SelectableEventsAdapter(this,events); eventsAdapter.setAdapter(eventsAdapter);你不需要爲ListView設置適配器嗎? – Olsavage 2012-08-09 16:07:33

+0

@Olsavage是的,你是對的那是一個錯誤...我設置適配器,有一點改進,我剛剛看到我的進度條第一次,但仍然失去了一些東西...列表視圖仍然是空的 – SKen 2012-08-09 16:44:54

回答

0

我認爲適配器中的事件列表與您的活動中的列表不同。

因此,要麼調用setAdapter()終於在事件列表中已填充,或在您的適配器

setItems(List<Events> events){ 
    this.events = events 
} 

創建setter和調用之前調用它notifyDataSetChanged()

您可能還需要用AsyncTask代替你的線程/處理程序實現,這個AsyncTask更易於閱讀並且使用更快(恕我直言)。

+0

謝謝@NathanZ指引我在正確的方向。我已經完成了並且現在正在運行。 – SKen 2012-08-10 12:13:25