如何从另一个类中的对话框更新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类刷新它?
答案 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)
您可以将callback
与MainActivity
中的对话框一起使用
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();