简体   繁体   English

我的回收站视图第一次没有在片段中显示

[英]My recycler view not shown for the first time in fragment

I am a beginner at android development.我是 android 开发的初学者。 I tried to display data on Recycle View using MVVM.我尝试使用 MVVM 在 Recycle View 上显示数据。 When I opened the fragment the first time it is empty, the second time it showed data.当我第一次打开片段时它是空的,第二次它显示数据。 Adapter not called the first time.第一次没有调用适配器。 How to fix this.如何解决这个问题。

Fragment class片段 class

public class fragmentEmployee extends Fragment {

private FragmentEmployeeBinding binding;
private ViewGroup viewGroup;
private View view;
private RecyclerView mRecycleView;
private UserAdapter mAdapter;
private EmployeeRegisterViewModel viewModel;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    binding = DataBindingUtil.inflate(inflater, R.layout.fragment_employee, viewGroup, false);
    view = binding.getRoot();
    return view;
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Toast.makeText(getContext(), "onViewCreated", Toast.LENGTH_SHORT).show();
    mRecycleView = binding.recyleViewEmployee;
    viewModel = new ViewModelProvider(this).get(EmployeeRegisterViewModel.class);
    viewModel.init();
    initRecycleView();
    viewModel.getEmployee().observe(getViewLifecycleOwner(), new Observer<List<employeeModel>>() {
        @Override
        public void onChanged(List<employeeModel> employeeModels) {
            mAdapter.notifyDataSetChanged();
        }
    });
}

private void initRecycleView() {
    mAdapter = new UserAdapter(getContext(), viewModel.getEmployee().getValue());
    RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getContext());
    mRecycleView.setLayoutManager(layoutManager);
    mRecycleView.setAdapter(mAdapter);
}
}

UserAdapter class用户适配器 class

public class UserAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{

public List<employeeModel> employeeModelList= new ArrayList<>();
public Context context1;

public UserAdapter(Context context,List<employeeModel> employeeModels){
    employeeModelList = employeeModels;
    context1 = context;
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.layout_listitem,parent,false);
    ViewHolder viewHolder=new ViewHolder(view);
    return viewHolder;
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
   (ViewHolder)holder).username.setText(employeeModelList.get(position).getName());
}

@Override
public int getItemCount() {
    return employeeModelList.size();
}

public class ViewHolder extends RecyclerView.ViewHolder{
TextView username;

public ViewHolder(@NonNull View itemView) {
    super(itemView);
    username=itemView.findViewById(R.id.userText);
}
}
}

Try reordering like this.尝试像这样重新排序。

Remove消除

mAdapter = new UserAdapter(getContext(), viewModel.getEmployee().getValue());

from initRecycleView来自initRecycleView

mAdapter = new UserAdapter(getContext(), viewModel.getEmployee().getValue());

viewModel.getEmployee().observe(getViewLifecycleOwner(), new Observer<List<employeeModel>>() {
        @Override
        public void onChanged(List<employeeModel> employeeModels) {
            mAdapter.notifyDataSetChanged();
        }
    });
initRecycleView();
mAdapter.notifyDataSetChanged(); 

Above method will work if the list declared inside adapter has any change.如果适配器内部声明的列表有任何变化,上述方法将起作用。 So, calling above method without changing adapter's list is useless.因此,在不更改适配器列表的情况下调用上述方法是没有用的。

Add a method to UserAdapter class to update list data.向 UserAdapter class 添加一个方法来更新列表数据。 Like:喜欢:

 public void updateData(List<employeeModel> updatedList){
    employeeModelList.clear();
    employeeModelList.addAll(updatedList);
    notifyDataSetChanged();
}

And call this method inside observer.并在观察者内部调用此方法。 Like:喜欢:

viewModel.getEmployee().observe(getViewLifecycleOwner(), new 
Observer<List<employeeModel>>() {
    @Override
    public void onChanged(List<employeeModel> employeeModels) {
        mAdapter.updateData(employeeModels);
    }
});

where are you get your network data?你从哪里得到你的网络数据?

If your get in here -> viewModel.init();如果你进入这里 -> viewModel.init(); I think it just timing problem.我认为这只是时间问题。

Just change code sequence只需更改代码顺序

initRecycleView();
viewModel.getEmployee().observe(getViewLifecycleOwner(), new Observer<List<employeeModel>>() {
    @Override
    public void onChanged(List<employeeModel> employeeModels) {
        mAdapter.notifyDataSetChanged();
    }
});
viewModel.init();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM