3 回答
TA贡献1853条经验 获得超18个赞
您的适配器列表类型不应是视图模型。如果您想在没有绑定的情况下使用实时数据,您需要在列表更新时自动更改 ui。
你可以这样做:
首先,您的电影类必须是模型类,而不是视图模型。
像往常一样做适配器。只需添加一个setList(Movie)
方法。此方法应更新适配器列表。不要忘记在更新列表后通知适配器。
然后创建 livedata 列表,如
MutableLiveData<List<Movie>> movieLiveData = new MutableLiveData<>();
你想在哪里。
在活动中观察这个列表,并在observe{}中调用适配器setList(Movie)方法。
毕竟,如果您的列表更新,setList(Movie)
将触发 medhod,然后您的 ui 将更新。
TA贡献2003条经验 获得超2个赞
你可以这样做:
视图模型:
class MyViewModel : ViewModel() {
private val items = MutableLiveData<List<String>>()
init {
obtainList()
}
fun obtainList() { // obtain list from repository
items.value = listOf("item1", "item2", "item3", "item4")
}
fun getItems(): LiveData<List<String>> {
return items
}
}
您的片段(或活动):
public class ContentFragment extends Fragment {
private MyViewModel viewModel;
private RecyclerView recyclerView;
private MyAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
viewModel = new ViewModelProvider(this).get(MyViewModel.class);
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_main, container, false);
recyclerView = root.findViewById(R.id.recycler_view);
recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 4));
// add observer
viewModel.getItems().observe(this, items -> {
adapter = new MyAdapter(items); // add items to adapter
recyclerView.setAdapter(adapter);
});
return root;
}
适配器:
class MyAdapter(val list: List<String>) : RecyclerView.Adapter<MyAdapter.TextViewHolder {
...
override fun onBindViewHolder(holder: TextViewHolder, position: Int) {
holder.textView.text = list[position] // assign titles from the list.
...
}
}
可以使用任何自定义对象代替 String 对象。
添加回答
举报