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();
    }
4

2 回答 2

1

我不是 100% 确定我是否知道您想做什么,但在我看来,您似乎想在 GridLayout 中拥有三个 TextView,当调用 updateSummary 方法时应该更新它们。如果是这样,您应该在活动的 xml 布局文件中定义它们并给它们一个 id。在您的活动中使用该函数textView = (TextView) findViewById(R.id.id_of_your_component),您可以通过 id 从您的 java 代码中访问 TextView,然后您可以更新三个组件的文本,textView.setText("your text")因为这似乎是您真正想要做的。目前,您每次调用 updateSummary 方法时都会创建新的 TextView,并将它们添加到 GridLayout,但您只需实例化它们一次(最好在 xml 布局中),然后在您的方法中更新它们。

于 2013-03-07T14:43:24.460 回答
0

我不确定 Cursor 的一部分,但总的来说,这是您可以用来更新 GridView 的方法。

  1. 您需要监视您的数据库更改(尽管有一些后台线程)。
  2. 如果基础数据集已更改,请调用 notifyDataSetChanged(参考:BaseAdapter.html#notifyDataSetChanged()SimpleCursorAdapter.html#notifyDataSetChanged()
  3. 一旦调用了上述方法,视图就会在它们变得可见时被刷新。
  4. 您不需要更新 GridView 中的所有单元格(但为每个单元格视图创建新的 TextView)。
  5. 实现getView()方法(当单元格变得可见时调用)以返回 GridView 中单元格的自定义视图。
  6. 还使用 ViewHolder 模式,这样您就不会每次都重新创建每个单元格(更像是缓存)。确保数据作为每个 getView 调用的一部分动态设置(我们只缓存视图 - UI 部分)

参考: 1.使用适配器构建布局 2.将视图对象保存在视图支架中

于 2013-03-07T16:35:02.470 回答