Почему LiveData не обновляет sh пользовательский интерфейс? - PullRequest
0 голосов
/ 19 февраля 2020

Я все еще учусь программировать и столкнулся с проблемой, которую я больше не могу получить:

Я использую 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?

...