未连接适配器; MVVM体系结构中的片段恢复后,跳过了Recycler Vierw中的布局问题 [英] No adapter attached; skipping layout issue in Recycler Vierw after fragment resume in MVVM architecture

本文介绍了未连接适配器; MVVM体系结构中的片段恢复后,跳过了Recycler Vierw中的布局问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用MVVM体系结构实现回收者视图.装入片段时,数据是第一次在回收器视图中填充,但是在按回键后又回到片段之后,恢复片段后,该数据不会加载列表.

I am implementing recycler view using MVVM architecture. The data is getting populated in recycler view for the first time when fragment is loaded but after coming back to the fragment after back press it does not load list after resuming fragment.

这是我对Fragment HomeFragment.java

Here, is my implementation for Fragment HomeFragment.java

public class HomeFragment extends Fragment {

private HomeViewModel homeViewModel;
private RecyclerView rv;
private ProgressBar pb;
private DataAdapter adapter;
private List<DataModel> modelList;

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.fragment_home, container, false);
    rv = v.findViewById(R.id.rv_home);
    pb = v.findViewById(R.id.home_pb);
    return v;
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    modelList = new ArrayList<>();
    Log.d("Home Frag", "onViewCreated: called again after back");

    rv.setLayoutManager(new GridLayoutManager(getActivity(), 2));
    rv.setHasFixedSize(true);

    pb.setVisibility(View.VISIBLE);
    homeViewModel = new ViewModelProvider(this).get(HomeViewModel.class);
    homeViewModel.getUserMutableLiveData().observe(Objects.requireNonNull(getActivity()), (userListUpdateObserver));
    pb.setVisibility(View.GONE);

    view.setFocusableInTouchMode(true);
    view.requestFocus();
    view.setOnKeyListener(new View.OnKeyListener() {
        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            Log.i("HomeFragment", "keyCode: " + keyCode);
            if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
                Log.i("HomeFragment", "keyCode: " + keyCode);
                AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
                builder.setTitle("Logout");
                builder.setMessage("Are you sure you want to Logout?");

                // add the buttons
                builder.setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                                getActivity().finish();
                            }
                        });
                builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        dialog.dismiss();
                    }
                });

                // create and show the alert dialog
                AlertDialog dialog = builder.create();
                dialog.show();
                return true;
            }
            return false;
        }
    });
}

Observer<List<Category>> userListUpdateObserver = new Observer<List<Category>>() {
    @Override
    public void onChanged(final List<Category> userArrayList) {
        for (int i = 0; i < userArrayList.size(); i++) {
            modelList.add(new DataModel(userArrayList.get(i).getTitle(), userArrayList.get(i).getImage(), userArrayList.get(i).getId(), 0));
        }
        adapter = new DataAdapter(getContext(), modelList, new DataAdapter.RecyclerViewClickListener() {
            @Override
            public void onClick(View view, int position) {
                homeViewModel.selectedId(modelList.get(position).getId());
                homeViewModel.selectedString(modelList.get(position).getText());
                SubCategoryFragment subCategoryFragment = new SubCategoryFragment();
                ManageFragments.replaceFragment((FragmentActivity) getContext(), subCategoryFragment);
            }
        });
        rv.setLayoutManager(new GridLayoutManager(getActivity(), 2));
        rv.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }
  };
}

这是我的ViewModel类 HomeViewModel.java

Here is my ViewModel class HomeViewModel.java

public class HomeViewModel extends ViewModel {

private MutableLiveData<List<Category>> userLiveData;
public static final MutableLiveData<Integer> selectedItemId = new MutableLiveData<Integer>();
private ApiInterface apiInterface;
public static final MutableLiveData<String> selectedString = new MutableLiveData<String>();

public HomeViewModel() {
    userLiveData = new MutableLiveData<List<Category>>();
    init();
}

public void selectedId(Integer id) {
    selectedItemId.setValue(id);
}

public void selectedString(String name) {
    selectedString.setValue(name);
}

MutableLiveData<List<Category>> getUserMutableLiveData() {
    return userLiveData;
}

private void init() {
    populateList();
}

private void populateList() {
    apiInterface = ApiRequest.createService(ApiInterface.class);
    Call<MainCategoryModel> call = apiInterface.getCategory();

    call.enqueue(new Callback<MainCategoryModel>() {
        @Override
        public void onResponse(Call<MainCategoryModel> call, Response<MainCategoryModel> response) {
            userLiveData.setValue(response.body().getData().getCategory());
        }

        @Override
        public void onFailure(Call<MainCategoryModel> call, Throwable t) {
            Log.d("TAG", "onFailure: " + t.getMessage());
        }
    });
  }
}

谢谢.

推荐答案

问题出在这一行:

homeViewModel.getUserMutableLiveData().observe(Objects.requireNonNull(getActivity()), (userListUpdateObserver));

您正在使用活动作为LifecycleOwner.在onViewCreated()中始终使用错误的LifecycleOwner.相反,您需要使用getViewLifecycleOwner()-与Fragment的视图关联的LifecycleOwner.

You're using the activity as the LifecycleOwner. That is always the wrong LifecycleOwner to use from within onViewCreated(). Instead, you need to use getViewLifecycleOwner() - the LifecycleOwner associated with the Fragment's view.

homeViewModel.getUserMutableLiveData().observe(getViewLifecycleOwner(), 
        userListUpdateObserver);

这篇关于未连接适配器; MVVM体系结构中的片段恢复后,跳过了Recycler Vierw中的布局问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆