0

データベースでデータが更新されるたびにグリッドレイアウトデータを更新する方法は? データベースでデータが更新されるたびに、サービスからメッセージをブロードキャストし、このアクティビティで受信したいと考えています。しかしupdateSummary()、ブロードキャスト レシーバーの Receive を呼び出すと、新しい子が既存の 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%確信が持てませんが、メソッドupdateSummaryが呼び出されたときに更新する必要があるGridLayoutに3つのTextViewが必要なようです。その場合は、アクティビティの xml レイアウト ファイルでそれらを定義し、ID を与える必要があります。アクティビティで関数を使用するtextView = (TextView) findViewById(R.id.id_of_your_component)と、id を介して Java コード内から TextViews にアクセスできます。次に、textView.setText("your text")これが本当にやりたいことのように見えるので、3 つのコンポーネントのテキストを更新できます。現時点では、メソッド updateSummary が呼び出されるたびに新しい TextView を作成し、それらを GridLayout に追加しますが、それらを 1 回だけインスタンス化して (xml レイアウトで最適)、メソッドで更新するだけです。

于 2013-03-07T14:43:24.460 に答える
0

Cursor の部分についてはわかりませんが、一般に、これは GridView を更新するために使用できるアプローチです。

  1. DB の変更を監視する必要があります (ただし、バックグラウンド スレッドがいくつかあります)。
  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 に答える