3

2 つのアクティビティがあります。1 つはSQLiteからのデータを表示し、もう 1 つはそこにデータを追加します。タブで切り替えることができます。問題は、新しいアイテムを追加すると、リストを更新する方法がわからないことです。これは、別のアクティビティ クラスにあり、追加クラスでアクセスできないためです。これはどのように解決できますか?

ここに私の2つのクラスがあります:

リスト:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_1);

    final ShoppingSQL shoppingSQL = new ShoppingSQL(this);
    final List<ShoppingData> list = shoppingSQL.getAll();

    final ArrayAdapter<ShoppingData> adapter = new ArrayAdapter<ShoppingData>(
            this, android.R.layout.simple_list_item_1, list);
    setListAdapter(adapter);

    this.getListView().setLongClickable(true);
       this.getListView().setOnItemLongClickListener(new OnItemLongClickListener() {
            public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) {
                shoppingSQL.delete((int)list.get(position).getId());
                adapter.remove(list.get(position));
                adapter.notifyDataSetChanged();
                return true;
            }
        });
}

追加:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_2);
}

public void ButtonOnClick(View v) {
    ShoppingSQL shoppingSQL = new ShoppingSQL(this);

    ShoppingData data = new ShoppingData();
    data.setName("test");

    shoppingSQL.add(data);

    Dialog d = new Dialog(this);
    d.setTitle("Added!");
    d.show();
}

また、ちょっとした補足質問があります。私の最初の (リスト) アクティビティで、「onLongClick」で変数にアクセスすると、Eclipseはすべての変数を final にしました - なぜそれを避けることができるのでしょうか? また、何を調べてコードを改善するか、または私が犯したその他の間違いについてのコメントも非常に良いでしょう。

4

2 に答える 2

3

私はそれをシンプルに保ちます。Add class から List クラスにインテントを送信するだけで、リストに新しい項目が再び入力されます。

于 2013-01-21T15:52:21.840 に答える
2

使用したいのは、SQLite DB に接続された CursorLoader です ( http://developer.android.com/reference/android/content/CursorLoader.htmlを参照)。次に、たとえば、アダプターが CursorLoader と同期する ListView を使用できます。これは、リスナー パターンを使用して (多かれ少なかれ) 自動的に行われます。

データを追加するアクティビティでは、データが変更されたことをすべてのリスナーに通知する必要があります。通常、これを行うには、notifyChangeを呼び出します( http://developer.android.com/reference/android/content/ContentResolver.html#notifyChange%28android.net.Uri,%20android.database.ContentObserver,%20boolean%29を参照) 。 .

また、独自のコンテンツ プロバイダーの実装を検討することもできます。

于 2013-01-21T15:49:47.400 に答える