RecyclerView: как обновить детали?

В MainActivity у меня список RecyclerView элементов CardView.

Щелчок на любом CardView запускает PictureActivity CardView, который отображает больше данных из базы данных для этого конкретного CardView.

Нажмите кнопку DetailsActivity CardView, чтобы запустить EditActivity для редактирования данных CardView. Нажатие кнопки "Сохранить" возвращает пользователя в элемент DetailsActivity, чтобы пользователь мог видеть любые измененные изменения в этом CardView. Модель для элемента CardView реализует Parcelable, поэтому я использую getParcelable() для передачи данных элемента и данных базы данных в "Направления действий".

Моя проблема заключается в том, что после нажатия "Сохранить" пользователь возвращается к DetailsActivity CardView, и отображается старый View for CardView (перед обновленными данными пользователь вводил и сохранял в базе данных). Я попытался использовать "adapter.notifyDataSetChanged()" для обновления представления, но не повезло.

Как-то из EditActivity мне нужно повторно загрузить MainActivity, чтобы RecyclerView обновлял адаптер и затем возвращал пользователя обновленному DetailsActivity CardView. Могу ли я каким-то образом использовать startActivityForResult()? Что мне здесь не хватает?

Вот продвижение пользовательского интерфейса:

MainActivity RecyclerView и адаптер:

- адаптер использует recyclerItemClickListener для отправки щелкнутого элемента CardView обратно в MainActivity, поэтому я могу использовать onItemClick() для запуска DetailsActivity.

- onItemClick() запускает DetailsActivity через намерение

DetailsActvity:

- использует onClickListener и намерение запускать EditActivity

EditActivity:

- Я бы хотел щелкнуть по кнопке "Сохранить" , чтобы сохранить новые/обновленные данные CardView в базе данных и вернуть пользователя обратно в Activity Activity, чтобы пользователь мог видеть изменения в CardView.

Adapter
...
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_contact_item, parent, false);
    final ItemHolder itemHolder = new ItemHolder(view);

        // Attach a Click listener to the items (row) view.
        // itemView is from the ItemHolder().
        // onItemClick is the click method in MainActivity.
        itemHolder.itemView.setOnClickListener(new View.OnClickListener() {
            // Handles the row being clicked.
            @Override
            public void onClick(View view) {

                ListItem adapterItem = MyRecylerAdapter.this.getItem(itemHolder.getAdapterPosition()); 
                if (recyclerItemClickListener != null) {
                    // pass the item to the Main Activity
                    // through the RecyclerItemClickListener file and its
                    // public interface.
                    recyclerItemClickListener.onItemClick(itemHolder.itemView, adapterItem);
                }
            }
        });            
    return itemHolder;
}

MainActivity (the RecyclerView Activity)
...
@Override
public void onItemClick(View view, ListItem listItem) {

    Intent intent = new Intent(this, DetailsActivity.class);        
    intent.putExtra("item",listItem);
    startActivity(intent);
}

DetailsActivity
...
public class DetailsActivity extends AppCompatActivity {

    onCreate(...) {

        Bundle extras = getIntent().getExtras();
        if (extras != null) {            
            listItem = extras.getParcelable("item"); 
    }

    helper = new SQLiteDB(this);
    listItems = new ArrayList<>();
    listItems = helper.getAllDBItems();

    cvdcardType1 = (TextView) findViewById(R.id.cvdcardType1);
    if (listItems !=null && listItems.size() !=0) {
        cvdcardType1.setText(listItem.getType());
    }

    cardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Intent i = new Intent(DetailsActivity.this,EditActivity.class);
            i.putExtra("cvdItem",listItem);                
            startActivityForResult(i,REQUEST_CODE);

        }
    });
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we're responding to
    if (requestCode == REQUEST_CODE) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            listItem = null;
            Bundle returnExtras = getIntent().getExtras();
            if (returnExtras != null) {
                listItem = returnExtras.getParcelable("returnItem");
                if (listItems !=null && listItems.size() !=0) {

                    cvdcardType1.setText(listItem.getType()); 
                    ...  
}
            }
        }
        else if (resultCode == Activity.RESULT_CANCELED) {
            // Finish the startActivityForResult().
            finish();
        }
    }
}

}

EditActivity

public class EditActivity extends AppCompatActivity {
onCreate(...) {
Bundle extras = getIntent().getExtras();
    if (extras != null) {            
        item = extras.getParcelable("cvdItem");
    }
}

// "Save Button"
public void onClickSaveEdits(View v) {
    // update database
    // update RecyclerView adapter and CardView Items
    // update DetailsActivity CardView
    // return the user to DetailsActivity to see updated CardView
    Intent returnIntent = new Intent(EditActivity.this, DetailsActivity.class);
    returnIntent.putExtra("returnItem", item);
    setResult(Activity.RESULT_OK,returnIntent);
    finish();
}

Ответ 1

Вы должны закончить DetailActivity, двигаясь в направлении EditActivity, а затем снова запустите DetailActivity в методе onBackPressed(), как показано ниже:

Intent intent = new Intent(EditActivity.this, DetailsActivity.class);        
intent.putExtra("item",item);
startActivity(intent);

Ответ 2

Просто вы можете прочитать элементы базы данных в onResume() в MainActivity снова после редактирования деталей.

allList = sqLiteDB.getAllDBItems();
adapter.notifyDatasetChanged();

В простых словах снова читайте список из базы данных и запишите его. И убедитесь, что вы сохранили изменения в базе данных в EditActivity

и вызовите EditActivity с startActivityForResult(), что бы вы ни изменили, передайте его обратно setResult();

и в onActivityResult метод DetailActivity заполняет данные новыми значениями.