繁体   English   中英

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

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

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

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

用户适配器 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);
}
}
}

尝试像这样重新排序。

消除

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();
mAdapter.notifyDataSetChanged(); 

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

向 UserAdapter class 添加一个方法来更新列表数据。 喜欢:

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

你从哪里得到你的网络数据?

如果你进入这里 -> viewModel.init(); 我认为这只是时间问题。

只需更改代码顺序

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