Я все еще учусь программировать и столкнулся с проблемой, которую я больше не могу получить:
Я использую RecyclerView, чтобы показать Обзор доступных записей пользователя. Теперь я хочу дать этому пользователю возможность редактировать имя в моей базе данных. для этого я открываю диалог и показываю текущее имя. здесь пользователь может ввести новое имя и сохранить его. Это работает Имя сохраняется в базе данных, но метод onChange моего наблюдателя LiveData не вызывается для обновления RecyclerView. Новое имя появляется только после перезапуска приложения или выхода и снова введите Activity.
Вот соответствующие цифры кода:
Метод onCreate моей Activity:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle(R.string.tv_ao_headline);
setContentView(R.layout.activity_child_accounts);
// get floating ActionButton
FloatingActionButton bAddAccount = findViewById(R.id.fabAddAccount);
final TextView tvEmptyAccountList = findViewById(R.id.tv_empty_account_list);
// create AccountList and add AccountAdapter
LinearLayoutManager layoutmanager = new LinearLayoutManager(this);
layoutmanager.setOrientation(LinearLayoutManager.VERTICAL);
final RecyclerView recyclerView = findViewById(R.id.rv_account_list);
recyclerView.setLayoutManager(layoutmanager);
recyclerView.setHasFixedSize(true);
final AccountAdapter adapter = new AccountAdapter();
recyclerView.setAdapter(adapter);
// get newest Data from Database
bookdataViewModel = ViewModelProviders.of(this).get(BookdataViewModel.class);
bookdataViewModel.getAllEntries().observe(this, new Observer<List<LSBookdata>>() {
@Override
public void onChanged(List<LSBookdata> lsBookdata) {
if (lsBookdata.isEmpty()) {
recyclerView.setVisibility(View.GONE);
tvEmptyAccountList.setVisibility(View.VISIBLE);
} else {
recyclerView.setVisibility(View.VISIBLE);
tvEmptyAccountList.setVisibility(View.GONE);
adapter.setAccounts(lsBookdata);
}
}
});
Метод onSwipe, где я вызываю мой метод "showEditDialog", чтобы показать пользовательский диалог:
// react of actions on RecyclerView
new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0, ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
private Drawable icon, iconDelete, iconEdit;
private ColorDrawable background, backgroundDelete, backgroundEdit;
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(@NonNull final RecyclerView.ViewHolder viewHolder, int direction) {
// get context
Context context = viewHolder.itemView.getContext();
if (direction == ItemTouchHelper.RIGHT) {
showEditDialog(viewHolder, adapter);
}
}
И метод showEditDialog, чтобы показать диалог и обновить базу данных:
public void showEditDialog(final RecyclerView.ViewHolder viewHolder, final AccountAdapter adapter) {
final AlertDialog dialogBuilder = new AlertDialog.Builder(this).create();
LayoutInflater inflater = this.getLayoutInflater();
View dialogView = inflater.inflate(R.layout.custom_dialog, null);
// Get Data from RecyclerView to edit
final LSBookdata lsBookdata = adapter.getAccoutAtPosX(viewHolder.getAdapterPosition());
final EditText et_accountChildName = (EditText) dialogView.findViewById(R.id.et_cd_childname);
et_accountChildName.setText(lsBookdata.child_name);
final TextView tv_editDialogHeadline = (TextView) dialogView.findViewById(R.id.tv_dialog_headline);
tv_editDialogHeadline.setText(R.string.tv_editdialog_headline);
Button bCreate = (Button) dialogView.findViewById(R.id.b_create);
bCreate.setText(R.string.bao_edit_text); // Change Button Text
Button bCancel = (Button) dialogView.findViewById(R.id.b_cancel);
bCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dialogBuilder.dismiss();
// refresh Account Overview
adapter.notifyItemChanged(viewHolder.getAdapterPosition());
}
});
bCreate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
UserLokalStore userLokalStore = UserLokalStore.getInstance(getApplicationContext());
// Create query for updating Child_name in Database
SupportSQLiteQuery query = new SimpleSQLiteQuery("UPDATE " + getString(R.string.tableName) + " " +
"SET child_name = '" + et_accountChildName.getText().toString() + "' WHERE customer_id = " + userLokalStore.getLoggedInUser().getUserId() + " AND id = " + lsBookdata.id);
try {
// update Child_Name in Database
bookdataViewModel.update(query);
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "Fehler: " + e, Toast.LENGTH_LONG).show();
}
dialogBuilder.dismiss();
// refresh Account Overview
adapter.notifyItemChanged(viewHolder.getAdapterPosition());
}
});
dialogBuilder.setView(dialogView);
dialogBuilder.show();
}
Может ли кто-нибудь помочь мне в дальнейшем?
ОБНОВЛЕНИЕ: Теперь я знаю, что когда я использую RawQuery в @Dao, это не вызовет Observer.onChange. Но почему и кто-нибудь знает, как решить эту проблему? Как это вызывает Observer.onChange?