在Android中使用仓库模式(Repository Pattern)来管理数据,可以更好地组织和维护代码。下面是一个示例,演示如何从视图模型(ViewModel)中更新嵌套的RecyclerView项。
首先,创建一个数据仓库类(Repository class),用于管理数据的获取和更新操作。
public class MyRepository {
private MutableLiveData> itemData = new MutableLiveData<>();
// 获取数据
public LiveData> getItemData() {
if (itemData.getValue() == null) {
loadItemData();
}
return itemData;
}
// 更新数据
public void updateItemData(Item item) {
List- items = itemData.getValue();
if (items != null) {
for (int i = 0; i < items.size(); i++) {
if (items.get(i).getId() == item.getId()) {
items.set(i, item);
break;
}
}
itemData.setValue(items);
}
}
// 加载初始数据
private void loadItemData() {
// 从网络或其他数据源加载数据,并将数据设置到itemData中
// 示例省略
}
}
然后,在视图模型中使用仓库类,将数据从仓库中获取并在RecyclerView中显示。
public class MyViewModel extends ViewModel {
private MyRepository repository;
private LiveData> items;
public MyViewModel() {
repository = new MyRepository();
items = repository.getItemData();
}
public LiveData> getItems() {
return items;
}
public void updateItem(Item item) {
repository.updateItemData(item);
}
}
接下来,在Activity或Fragment中使用视图模型,并将数据绑定到RecyclerView中。
public class MyActivity extends AppCompatActivity {
private MyViewModel viewModel;
private RecyclerView recyclerView;
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
viewModel = ViewModelProviders.of(this).get(MyViewModel.class);
recyclerView = findViewById(R.id.recyclerView);
adapter = new MyAdapter();
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
viewModel.getItems().observe(this, new Observer>() {
@Override
public void onChanged(List- items) {
adapter.setItems(items);
}
});
}
}
最后,创建一个适配器类(Adapter class)来管理RecyclerView中的项。
public class MyAdapter extends RecyclerView.Adapter {
private List- items = new ArrayList<>();
public void setItems(List
- items) {
this.items = items;
notifyDataSetChanged();
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
Item item = items.get(position);
holder.bind(item);
}
@Override
public int getItemCount() {
return items.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private TextView textView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
textView = itemView.findViewById(R.id.textView);
}
public void bind(Item item) {
textView.setText(item.getName());
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 在点击项时更新数据
item.setIsSelected(!item.isSelected());
notifyItemChanged(getAdapterPosition());
// 将更新后的数据传递给视图模型
((MyActivity) v.getContext()).getViewModel().updateItem(item);
}
});
}
}
}
这样,当用户点击RecyclerView中的项时,项的状态将更新,并通过视图模型和数据仓库进行更新。