我的回收者视图首次未在片段中显示

时间:2021-04-07 09:57:12

标签: java android android-mvvm

我是安卓开发的初学者。我尝试使用 MVVM 在 Recycle View 上显示数据。当我第一次打开片段时它是空的,第二次它显示数据。适配器不是第一次调用。如何解决这个问题。

片段类

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

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);
}
}
}

2 个答案:

答案 0 :(得分:3)

尝试像这样重新排序。

删除

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

来自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();

答案 1 :(得分:1)

mAdapter.notifyDataSetChanged(); 

如果在适配器内部声明的列表有任何更改,则上述方法将起作用。因此,在不更改适配器列表的情况下调用上述方法是没有用的。

向 UserAdapter 类添加更新列表数据的方法。喜欢:

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

并在观察者内部调用此方法。喜欢:

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