从对话框更新 RecyclerView

Update RecyclerView from Dialog

如何从另一个 class 中的对话框更新 recyclerview?

我的对话框作为一个单独的 class 从 mainActivity 调用。当我在数据库中进行更改时,我想更新 mainActivity 上的 recyclerview。

对话:

public class Dialog {

DatabaseExecutor databaseExecutor = new DatabaseExecutor();
private final Activity activity;
private final List<Passenger> passengers;
private final int position;

public Dialog (final Activity activity, final List<Passenger> passengers, final int position){
    this.activity = activity;
    this.passengers = passengers;
    this.position = position;
}

public void showDialog (){
    final BottomSheetDialog dialog = new BottomSheetDialog(activity);
    dialog.setContentView(R.layout.custom_dialog);

    final AppCompatImageView dial, message, info, paid, edit, delete;
    final AppCompatTextView name;

    name = dialog.findViewById(R.id.dialog_name);
    paid = dialog.findViewById(R.id.dialog_paid);

    name.setText(passengers.get(position).getName());
    if(passengers.get(position).isPaid())
        paid.setImageResource(R.drawable.money_paid_72);
    else
        paid.setImageResource(R.drawable.money_unpaid_72);

    paid.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Passenger passenger = passengers.get(position);
            if (!passengers.get(position).isPaid()){
                passenger.setPaid(true);
                passenger.setTumblr(R.drawable.money_paid);
                passenger.setUser(R.drawable.user_icon);
                paid.setImageResource(R.drawable.money_paid_72);
            }
            else {
                passenger.setPaid(false);
                passenger.setTumblr(R.drawable.money_unpaid);
                passenger.setUser(R.drawable.user_icon_unpaid);
                paid.setImageResource(R.drawable.money_unpaid_72);
            }
            databaseExecutor.updatePassenger(activity, passenger);
        }
    });
dialog.show();
}
}

P.s。当这个对话框在 mainActivity 中时,我只是调用了 populateData 方法并且它起作用了。但是如何从这个对话框中刷新它class?

一个直接的解决方案是在您传递给对话框的 activity 上调用方法。有recyclerview和notifyDataSetChanged()刷新数据还是合适的。

一个更通用和 imo 更好的架构相关解决方案是使用 Room 或类似的数据库,您可以在其中观察数据的变化。假设数据库中的数据在任何地方都发生了变化。所有观察到这些数据的地方(比如 LiveData),数据都会被刷新。如果您还使用 Paging 库,数据也会在 recyclerview 中刷新和动画化。

Dialog 不应直接刷新 RecycverView。相反,您应该从 activity 传递监听器。 Activity 可以根据需要刷新回收器 notifyDataSetChanged

通常对话框应该是 'dumb' ui,你不应该给它太多的控制权,尤其是在对话框中没有显示的元素上。这种方法将使您的对话框更易于重用和维护。

在对话框中:

有接口

public interface onDialogFinishCallback { void refreshRecyclerView(); }

现在在您的 activity 中实施上述内容。

关闭对话框之前或数据库更改操作调用之后 callback.refreshRecyclerView

在你的对话框中写一个界面

public interface onClickInterface{ public void updateRecyclerView(int position); }

在对话框中为此界面声明新变量class

private onClickInterface mOnClickInterface;

然后从要更新 recyclerview 的对话框 class 中调用方法 updateRecyclerView()

mOnClickInterface.updateRecyclerView(position);

然后为此接口实现您的 MainActivity 并覆盖此方法

@override    
public void updateRecyclerView(int position){
     //alter your list which you are passing to your adapter
     Passenger passenger = passengers.get(position);
     passenger.setPaid(true);
     rAdapter.notifyDatasetChanged();
}

您可以在 MainActivity

中使用带有对话框的 callback
public interface DialogCallback {
    public void onDialogCallback();
}

您的 Dialog 构造函数应该是

DialogCallback callback;

public Dialog (final Activity activity, final List<Passenger> passengers, final int position, DialogCallback callback){
    this.activity = activity;
    this.passengers = passengers;
    this.position = position;
    this.callback = callback;
}

在您的对话框按钮中单击使用以下代码,

paid.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Passenger passenger = passengers.get(position);
        if (!passengers.get(position).isPaid()){
            passenger.setPaid(true);
            passenger.setTumblr(R.drawable.money_paid);
            passenger.setUser(R.drawable.user_icon);
            paid.setImageResource(R.drawable.money_paid_72);
        }
        else {
            passenger.setPaid(false);
            passenger.setTumblr(R.drawable.money_unpaid);
            passenger.setUser(R.drawable.user_icon_unpaid);
            paid.setImageResource(R.drawable.money_unpaid_72);
        }
        databaseExecutor.updatePassenger(activity, passenger);
        callback.onDialogCallback(); // Add this line
    }
});

在你的MainActivity中使用下面的代码,

Dialog dialog = new Dialog(this, passengers, position, new DialogCallback() {
    @Override
    public void onDialogCallback() {
        // Update recycler view code here
    }
});
dialog.showDialog();