简体   繁体   中英

My recycler view not shown for the first time in fragment

I am a beginner at android development. I tried to display data on Recycle View using MVVM. 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

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

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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