从对话框更新 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();
如何从另一个 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();