Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中片段中带有ViewModel的RecyclerView_Java_Android Studio - Fatal编程技术网

Java中片段中带有ViewModel的RecyclerView

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

我有一个与RecyclerView MVVM项目,我是新的Android架构组件! 现在我想使用ViewModel保持RecyclerView的状态,但在片段中我的代码不起作用(在活动中起作用)

现在我只显示MyFragment和MyViewModel,其余的我都附加了一个到教程的链接

辅导

我的幻觉

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"