2012-10-17 37 views
0

我的應用程序能夠從GCM接收消息並將消息保存到手機上的SQLlite數據庫。這些消息可以在具有列表視圖的活動中查看。設備收到GCM IntentService消息時刷新ListView

在下面的代碼中,onPause()函數刷新listView。這不是一個好的實現,因爲它只適用於在更新時不顯示活動。如果活動在更新時顯示,則列表是靜態的並且不會更新。

問題:

  1. 如何我更新列表視圖正在顯示活動時?或者有沒有辦法使用後臺服務來更新適配器,以便無論何時顯示活動,它總是顯示最新的數據。

  2. 是目前這種類型的功能目前不可能與android和我需要實現其他像'拉到刷新'的東西?在的onResume

刷新列表視圖()崩潰的應用程序,並顯示了一個空指針異常。

活動:

public class NotesView extends Activity implements OnItemClickListener { 


    ListView listView; 
    NoteAdapter objAdapter; 
    NotificationsDatabase db = new NotificationsDatabase(this); 
    List<Notes> listAlerts; 
    String note; 
    String time; 
    TextView noteView; 
    TextView timeView; 


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

     listView = (ListView) findViewById(R.id.notelist); 
     listView.setOnItemClickListener(this); 
     noteView = (TextView) findViewById(R.id.noteDisplay); 
     timeView = (TextView) findViewById(R.id.notetimeStampDisplay); 
     new MyTask().execute(); 


    } 

    // My AsyncTask start... 
    class MyTask extends AsyncTask<Void, Void, List<Notes>> { 

     ProgressDialog pDialog; 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 

      pDialog = new ProgressDialog(NotesView.this); 
      pDialog.setMessage("Loading..."); 
      pDialog.setCancelable(false); 
      pDialog.show(); 

      if (isCancelled()) { 

       this.cancel(true); 
      } 

     } 


     @Override 
     protected List<Notes> doInBackground(Void... params) { 


      db.open(); 
      listAlerts = db.getData(); 

      if (isCancelled()) { 

       this.cancel(true); 
      } 


      return null; 
     } 

     protected void onPostExecute(List<Notes> alerts) { 


      if (null != pDialog && pDialog.isShowing()) { 
       pDialog.dismiss(); 
      } 
      db.close(); 
      setAdapterToListview(); 

     } 


    }// end myTask 


    public void setAdapterToListview() { 

     objAdapter = new NoteAdapter(NotesView.this, R.layout.row_notes, listAlerts); 
     objAdapter.sortByNoteDesc(); 
     objAdapter.notifyDataSetChanged(); 
     listView.setAdapter(objAdapter); 
    } 


    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 
      Intent intent = new Intent(
        NotesView.this.getApplicationContext(), 
        TabBarExample.class); 
      intent.putExtra("goToTab", "Alerts"); 
      startActivity(intent); 
      return true; 
     } 

     return super.onKeyDown(keyCode, event); 
    } 


    public void onItemClick(AdapterView<?> parent, View viewDel, int position, 
          long id) { 


     for (int i = 0; i < 1; i++) { 
      Notes item = listAlerts.get(position); 
      int ids = item.getId(); 
      note = item.getNote(); 
      time = item.getTimeStamp(); 

     } 

     System.out.println(note + " " + time); 

     //  
    } 


    @Override 
    protected void onResume() { 

     super.onResume(); 


    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 

     setContentView(R.layout.note); 

     listView = (ListView) findViewById(R.id.notelist); 
     listView.setAdapter(null); 
     listView.setOnItemClickListener(this); 
     noteView = (TextView) findViewById(R.id.noteDisplay); 
     timeView = (TextView) findViewById(R.id.notetimeStampDisplay); 
     new MyTask().execute(); 


    } 

    @Override 
    protected void onDestroy() { 

    } 


} 

中的代碼段GCMIntentService

@Override 
protected void onMessage(Context context, Intent intent) { 
    Log.i(TAG, "Received message"); 
    //String message = getString(R.string.gcm_message); 

    System.out.println("onMessage: "); 


    Bundle extras = intent.getExtras(); 

    String message = extras.getString("message"); 
    String event_id_from_server = extras.getString("server_id"); 
    // displayMessage(context, message); 
    generateNotification(context, message); 
    saveMsg(message); 

    System.out.println("server id is " + event_id_from_server); 

    if (event_id_from_server != null) { 

     updateLocalDatabase(event_id_from_server); 

    } 


} 

public void saveMsg(String msg) { 

    boolean worked = true; 
    try { 

     NotificationsDatabase entry = new NotificationsDatabase(GCMIntentService.this); 
     entry.open(); 
     java.util.Date date = new java.util.Date(); 
     Timestamp x = new Timestamp(date.getTime()); 

     String timeStamp = x.toLocaleString(); 
     entry.createEntry(msg, timeStamp); 

     entry.close(); 

     //update adapter service 


    } catch (Exception e) { 
     worked = false; 
     String error = e.toString(); 
     System.out.println(error); 
    } finally { 
     if (worked) { 


     } 

    } 
} 

回答

3

我清理你的代碼一點點。基本上所有的視圖分配應該在onCreate中完成一次,而數據的加載應該在onResume()中完成。看看這是否有幫助:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.note); 
    listView = (ListView) findViewById(R.id.notelist); 
    listView.setAdapter(null); 
    listView.setOnItemClickListener(this); 
    noteView = (TextView) findViewById(R.id.noteDisplay); 
    timeView = (TextView) findViewById(R.id.notetimeStampDisplay); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    new MyTask().execute(); 
} 

@Override 
    protected void onPause() { 
    super.onPause(); 
}