Activity/Fragment 和 ViewModel 在 Adapter 中的良好实践?
Activity/Fragment and ViewModel in Adapter good practice?
假设我们有 Activity/Fragment,其中包含一个 RecyclerView。此外,它设置了一个适配器。为便于示例,假设 Adapter 必须有权访问 Fragment 才能调用显示 Snackbar 的方法。此外,假设适配器中有几个项目。我想删除一个并将其从数据库中删除。因此我应该调用 ViewModel 的方法。我已经进行了研究,但我找不到任何信息,如果将片段引用到适配器中是好是坏。
你能帮我解释一下吗?同样对于 ViewModel,我发现了一些想法 。
但是最佳做法是什么?
- 好的适配器 类 应该是静态的,以帮助开发人员将其与 Activity/Fragment 部分分开
- 不要在适配器中保存 Activity/Fragment 引用
- ViewModels 应该属于 Activity 或 Fragments
- 适配器应通过 Callbacks/Listeners 或 LiveData
执行 Activity/Fragment 的操作
Pseudo-code:
public class MainActivity extends Activity {
private interface Listener {
void OnRemoved(@NonNull xxx removedItem);
}
private static final class MyAdapter extends ArrayAdapter<xxx> {
private final Listener mListener;
private MyAdapter(@NonNull final Listener listener) {
super(...);
this.mListener = listener;
}
@Override
public void remove(xxx item) {
super.remove(xxx); //<-- this removes item from Adapter
this.mListener.OnRemoved(item); //<-- this triggers Activity's code
}
}
public void onCreate(...) {
...
new MyAdapter(new Listener() {
@Override
public void OnRemoved(@NonNull final xxx removedItem) {
Snakbar.makeText(....).show();
}
});
}
}
假设我们有 Activity/Fragment,其中包含一个 RecyclerView。此外,它设置了一个适配器。为便于示例,假设 Adapter 必须有权访问 Fragment 才能调用显示 Snackbar 的方法。此外,假设适配器中有几个项目。我想删除一个并将其从数据库中删除。因此我应该调用 ViewModel 的方法。我已经进行了研究,但我找不到任何信息,如果将片段引用到适配器中是好是坏。
你能帮我解释一下吗?同样对于 ViewModel,我发现了一些想法
但是最佳做法是什么?
- 好的适配器 类 应该是静态的,以帮助开发人员将其与 Activity/Fragment 部分分开
- 不要在适配器中保存 Activity/Fragment 引用
- ViewModels 应该属于 Activity 或 Fragments
- 适配器应通过 Callbacks/Listeners 或 LiveData 执行 Activity/Fragment 的操作
Pseudo-code:
public class MainActivity extends Activity {
private interface Listener {
void OnRemoved(@NonNull xxx removedItem);
}
private static final class MyAdapter extends ArrayAdapter<xxx> {
private final Listener mListener;
private MyAdapter(@NonNull final Listener listener) {
super(...);
this.mListener = listener;
}
@Override
public void remove(xxx item) {
super.remove(xxx); //<-- this removes item from Adapter
this.mListener.OnRemoved(item); //<-- this triggers Activity's code
}
}
public void onCreate(...) {
...
new MyAdapter(new Listener() {
@Override
public void OnRemoved(@NonNull final xxx removedItem) {
Snakbar.makeText(....).show();
}
});
}
}