2013-03-07 15 views
0

如何在數據更新數據庫時更新網格佈局數據?無論何時數據在數據庫中更新,我都希望從服務中廣播消息並接收此Acitivty。但是,如果我在接收廣播接收器時調用updateSummary(),它會向現有gridLyout子項添加新子項。如何定期更換現有子項並刷新網格佈局?如何更新網格佈局數據定期

public class MyActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.my_activity); 
     updateSummary(); 
    } 

    public void updateSummary() 
    { 
     gridLayout=(GridLayout)findViewById(R.id.newgrid); 

     DBHelper dbHelper = new DBHelper(this); 
     SQLiteDatabase mySummaryDB = dbHelper.getWritableDatabase(); 

     if (mySummaryDB != null) { 

      String mycols=DBConstants.ID+","+DBConstants.NUMBER+","+DBConstants.DATE+","+DBConstants.TIME; 

      Cursor c0 = mySummaryDB.rawQuery("select distinct("+DBConstants.NUMBER+") from "+DBConstants.MASTER_DATA_TABLE+"", null); 


      if(c0!=null) 
      { 
       if(c0.moveToFirst()) 
       { 
        do 
        { 

         String number = c0.getString(c0.getColumnIndex(DBConstants.NUMBER)); 

         Cursor c1 = mySummaryDB.rawQuery("select "+mycols+" from "+DBConstants.MASTER_DATA_TABLE+" where "+DBConstants.NUMBER+"='"+NUMBER+"' order by "+DBConstants.MYDATETIME+" desc limit 1", null); 

         Log.i("summary",Integer.toString(c1.getCount())); 

         if(c1!=null) 
         { 
          if(c1.moveToFirst()) 
          { 
           int increment=0; 
           do 
           { 
            String id = c1.getString(c1.getColumnIndex(DBConstants.ID)); 
            String date = c1.getString(c1.getColumnIndex(DBConstants.DATE)); 
            String time = c1.getString(c1.getColumnIndex(DBConstants.TIME)); 

            Cursor c2 = mySummaryDB.query(DBConstants.MYDATA_TABLE,new String[]{DBConstants.NAME}, DBConstants.NUMBER+"=?", new String[]{number}, null, null, null); 
            String name=""; 

            if(c2!=null) 
            { 
             if(c2.moveToFirst()) 
             { 
              name = c2.getString(c2.getColumnIndex(DBConstants.NAME)); 
              Log.i("summary", "name->"+name); 
             } 
            } 
            c2.close(); 


             TextView nameTV = new TextView(this); 
             nameTV.setText(name); 
             gridLayout.addView(nameTV); 


             TextView dateTV = new TextView(this); 
             dateTV.setText(date); 
             gridLayout.addView(dateTV); 

             TextView timeTV = new TextView(this); 
             timeTV.setText(time); 
             gridLayout.addView(timeTV); 

            } 
             increment=increment+1; 
           } 
           while(c1.moveToNext()); 
          } 
         } 
       } 
        while(c0.moveToNext()); 

      } 
     } 

     dbHelper.close(); 
    } 

回答

1

我不是100%肯定,如果我知道你想要做什麼,但如果你想在你的網格佈局3個TextViews當方法updateSummary被稱爲應該被更新,在我看來。如果是這樣,你應該在你的活動的xml佈局文件中定義它們並給它們一個id。在你的活動中使用函數textView = (TextView) findViewById(R.id.id_of_your_component),你可以通過id從你的java代碼中訪問TextViews,然後你可以用textView.setText("your text")更新這三個組件的文本,因爲看起來這是你真正想做的。在你每次調用updateSummary方法並創建新的TextView的時刻,將它們添加到GridLayout中,但你只需要實例化它們一次(最好在xml佈局中),然後在你的方法中更新它們。

+0

No.Grid佈局動態行。因此它可能隨機變化。所以我不能更新Textview的id。基本上我想更新GridLayout內的數據,如更新ListView適配器 – Ramprasad 2013-03-07 15:05:05

0

我不確定它的遊標部分,但通常這是您可以用來更新GridView的方法。

  1. 你需要監視你的數據庫變化(儘管一些後臺線程)。
  2. 如果基礎數據集已經改變,調用notifyDataSetChanged(編號:BaseAdapter.html#notifyDataSetChanged()SimpleCursorAdapter.html#notifyDataSetChanged()
  3. 一旦上述方法被調用時,意見會得到刷新時它們變得可見
  4. 您不需要更新所有。細胞在GridView(但創建每個單元查看新的TextView)。
  5. 落實getView()方法(當過的細胞變得可見這被稱爲)返回GridView中細胞的自定義視圖。
  6. 還可以使用ViewHolder模式,以便每次都不重新創建每個單元格(更像是緩存)柯確保數據是動態設置的每個getView調用的一部分(我們只緩存視圖 - UI部分)

參考文獻:1. Building Layouts with an Adapter 2. Hold View Objects in a View Holder

+0

仍然我沒有使用任何適配器或裝載機從數據庫中查詢數據。有沒有可能像ListView一樣設置GridAdout的適配器? – Ramprasad 2013-03-08 02:17:09

+0

我不這麼認爲。我誤解爲GridView。爲什麼你不能使用GridView而不是GridLayout? – Rajendra 2013-03-08 03:36:45

+0

因爲我需要表格佈局以及動態行的正確對齊。我們可以通過在gridLayout中提供ncolumns來對齊。 – Ramprasad 2013-03-08 05:05:47