Java中片段中带有ViewModel的RecyclerView
我有一个与RecyclerView MVVM项目,我是新的Android架构组件! 现在我想使用ViewModel保持RecyclerView的状态,但在片段中我的代码不起作用(在活动中起作用) 现在我只显示MyFragment和MyViewModel,其余的我都附加了一个到教程的链接 辅导 我的幻觉Java中片段中带有ViewModel的RecyclerView,java,android-studio,Java,Android Studio,我有一个与RecyclerView MVVM项目,我是新的Android架构组件! 现在我想使用ViewModel保持RecyclerView的状态,但在片段中我的代码不起作用(在活动中起作用) 现在我只显示MyFragment和MyViewModel,其余的我都附加了一个到教程的链接 辅导 我的幻觉 public class HomeFragment extends Fragment implements LifecycleOwner { private RecyclerView
public class HomeFragment extends Fragment implements LifecycleOwner {
private RecyclerView recyclerView;
private HomeAdapter homeAdapter;
private HomeViewModel viewModel;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_home, container, false);
this.setHasOptionsMenu(true);
recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
//I use code from
//https://developer.android.com/topic/libraries/architecture/viewmodel
viewModel.getUserMutableLiveData().observe(getViewLifecycleOwner(), userListUpdateObserver);
viewModel = new ViewModelProvider(requireActivity()).get(HomeViewModel.class);
return view;
}
private Observer<ArrayList<ProductData>> userListUpdateObserver = new Observer<ArrayList<ProductData>>() {
@Override
public void onChanged(ArrayList<ProductData> userArrayList) {
homeAdapter = new HomeAdapter(requireActivity(),userArrayList);
recyclerView.setLayoutManager(new LinearLayoutManager(requireActivity()));
recyclerView.setAdapter(homeAdapter);
}
};
}
公共类HomeFragment扩展片段实现LifecycleOwner{
私人回收站;
私人家庭适配器;
私有家庭视图模型视图模型;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
最终视图=充气机。充气(R.layout.fragment\u home,container,false);
此.sethasOptions菜单(true);
recyclerView=(recyclerView)view.findViewById(R.id.recyclerView);
//我使用来自
//https://developer.android.com/topic/libraries/architecture/viewmodel
viewModel.getUserMutableLiveData().observe(getViewLifecycleOwner(),userListUpdateObserver);
viewModel=新的ViewModelProvider(require()).get(HomeViewModel.class);
返回视图;
}
私有观察者userListUpdateObserver=新观察者(){
@凌驾
更改后的公共void(ArrayList用户ArrayList){
homeAdapter=新的homeAdapter(requirectivity(),userArrayList);
setLayoutManager(新的LinearLayoutManager(require());
recyclerView.setAdapter(homeAdapter);
}
};
}
我的视图模型
public class HomeViewModel extends ViewModel {
private MutableLiveData<ArrayList<ProductData>> userLiveData;
private ArrayList<ProductData> userArrayList;
public HomeViewModel() {
userLiveData = new MutableLiveData<>();
init();
}
MutableLiveData<ArrayList<ProductData>> getUserMutableLiveData() {
return userLiveData;
}
private void init(){
populateList();
userLiveData.setValue(userArrayList);
}
private void populateList(){
ProductData user = new ProductData();
user.setName("Daylight");
user.setPrice("Best rating movie");
userArrayList = new ArrayList<>();
userArrayList.add(user);
userArrayList.add(user);
userArrayList.add(user);
userArrayList.add(user);
userArrayList.add(user);
userArrayList.add(user);
userArrayList.add(user);
userArrayList.add(user);
userArrayList.add(user);
userArrayList.add(user);
userArrayList.add(user);
userArrayList.add(user);
}
}
公共类HomeViewModel扩展了ViewModel{
私有MutableLiveData用户livedata;
私有ArrayList用户ArrayList;
公共HomeViewModel(){
userLiveData=新的MutableLiveData();
init();
}
MutableLiveData getUserMutableLiveData(){
返回userLiveData;
}
私有void init(){
大众主义者();
setValue(userArrayList);
}
私有void populateList(){
ProductData用户=新ProductData();
user.setName(“日光”);
user.setPrice(“最佳评级影片”);
userArrayList=新建ArrayList();
添加(用户);
添加(用户);
添加(用户);
添加(用户);
添加(用户);
添加(用户);
添加(用户);
添加(用户);
添加(用户);
添加(用户);
添加(用户);
添加(用户);
}
}
在您的HomeFragment上,当当前为null
时,您正在访问viewModel
。您应该更改此选项:
viewModel.getUserMutableLiveData().observe(getViewLifecycleOwner(), userListUpdateObserver);
viewModel = new ViewModelProvider(requireActivity()).get(HomeViewModel.class);
为此:
viewModel = new ViewModelProvider(requireActivity()).get(HomeViewModel.class);
viewModel.getUserMutableLiveData().observe(getViewLifecycleOwner(), userListUpdateObserver);
我希望这对您有所帮助。在您的HomeFragment上,当当前为
null
时,您正在使用viewModel
。您应该更改此选项:
viewModel.getUserMutableLiveData().observe(getViewLifecycleOwner(), userListUpdateObserver);
viewModel = new ViewModelProvider(requireActivity()).get(HomeViewModel.class);
为此:
viewModel = new ViewModelProvider(requireActivity()).get(HomeViewModel.class);
viewModel.getUserMutableLiveData().observe(getViewLifecycleOwner(), userListUpdateObserver);
我希望这对您有所帮助。问题出在Fragment and RecyclerView本身。 我通过调用XML中的setLayoutManager成功地解决了这个问题 在MyFragment中,我删除了
recyclerView.setLayoutManager(new LinearLayoutManager(requireActivity()));
我用XML调用setLayoutManager
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
问题出在Fragment和RecyclerView本身。 我通过调用XML中的setLayoutManager成功地解决了这个问题 在MyFragment中,我删除了
recyclerView.setLayoutManager(new LinearLayoutManager(requireActivity()));
我用XML调用setLayoutManager
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"