从对话框更新RecyclerView

时间:2018-08-23 10:09:22

标签: android android-recyclerview bottom-sheet

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

我的对话框是一个单独的类,从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方法即可,并且可以正常工作。但是如何从Dialog类刷新它?

5 个答案:

答案 0 :(得分:1)

在对话框中:

具有界面

public interface onDialogFinishCallback { void refreshRecyclerView(); }

现在在您的活动中实施以上操作。

在关闭对话框之前或在db change操作调用之后 callback.refreshRecyclerView

答案 1 :(得分:0)

直接的解决方案是在传递给对话框的活动上调用方法。有刷新recyclerview的数据和notifyDataSetChanged()或适当的数据。

与体系结构相关的更通用,更好的imo解决方案是使用Room或类似的db,您可以在其中观察数据的变化。假设db中的数据在任何地方都已更改。在所有观察到此数据的地方(例如LiveData),都会刷新数据。如果您还使用分页库,则数据也会在recyclerview中刷新和动画化。

答案 2 :(得分:0)

对话框不应直接刷新RecyclverView。相反,您应该通过活动传递侦听器。如果需要,reportParser(report).then((data) => { // Work with the returned data }).catch((err) => { // Handle errors })的活动可以刷新回收站。

通常,对话框应该是'dumb'ui,并且您不应该对其进行过多控制,尤其是不要限制对话框中未显示的元素。这种方法将使您的对话框更加可重用,并且易于维护。

答案 3 :(得分:0)

在对话框中写一个界面

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

在对话框类中为此接口声明新变量

private onClickInterface mOnClickInterface;

然后从要更新recyclerview的对话框类中调用方法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();
}

答案 4 :(得分:0)

您可以将callbackMainActivity中的对话框一起使用

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();