web-dev-qa-db-ja.com

別のアクティビティからRecyclerviewを更新する

私のメインアクティビティにはフラグメントがあり、データベースから入力されたすべてのデータをRecyclerviewが取得しています。このフラグメントでは、データベースにオブジェクトを挿入するために別のアクティビティを呼び出すボタンがあります。

問題は、アクティビティが終了してメインアクティビティに戻ると、Recyclerviewに作成したばかりの新しいアイテムが表示されないことです。私はこのコードを試してみました:

 @Override
    public void onResume() {
            super.onResume();
            adapterItem.addItem(MyApplication.getWritableDatabase().getAllItems());
            listProjectsView.scrollToPosition(0);
        }

関数getAllItemsは、sqliteからすべてのデータを取得します。

RecyclerviewのadapterItemで、次のようになりました。

public void addItem(ArrayList<Item> listItems) {
        this.listItems = listItems;
        notifyItemInserted(0);
    }

それは「うまく」動作します。主な問題は、モバイルで進行中の別のアプリケーションに切り替えて、開発したアプリに戻ると、onResumeメソッドがオンになり、最後の挿入を再度表示して、このアイテムを2回入力することです(もう一度やります)。

ありがとう

13
Jose M

新しいアイテムをMainActivityに戻し、自分で処理します。

1. MainActivityで、次のようにstartActivityForResultを使用して2番目のアクティビティを開始します。

startActivityForResult(new Intent(this, SecondActivity.class), REQUEST_CODE);

REQUEST_CODEintです。

2. 2番目のアクティビティで、次のようにfinishをオーバーライドします。

@Override
public void finish() {
    Intent returnIntent = new Intent();
    returnIntent.putExtra("passed_item", itemYouJustCreated);
    // setResult(RESULT_OK);
    setResult(RESULT_OK, returnIntent); //By not passing the intent in the result, the calling activity will get null data.
    super.finish();
}

3. MainActivityで、次のようにonActivityResultをオーバーライドします。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
        YourItem passedItem = data.getExtras().get("passed_item");
        // deal with the item yourself

    }
}
13
Wesley

Recyclerviewを表示するアクティビティ(firstActivityなど)で静的recyclerview(mRecyclerviewなど)を作成できます。そして、他のアクティビティ(たとえばsecondActivity)でリストに新しいアイテムを追加するときは、次を使用できます。

     firstActivity.mRecyclerview.getAdapter().notifyDataSetChanged();

私はしばらくこの方法を使用し、パフォーマンスの問題は発生しませんでしたが、確実に独自のコードでテストしてください。

3
mears

このようにしてみてください、

Intent intent = new Intent(Context, YourClass);
startActivityForResult(intent, ADD_ITEM);

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == Activity.RESULT_OK) {
        if (requestCode == ADD_ITEM){
            adapterItem.addItem(MyApplication.getWritableDatabase().getAllItems());
            listProjectsView.scrollToPosition(0);
        }
    }       
}

それがあなたのために働くことを願っています

0
Akash Moradiya