【发布时间】:2021-08-30 20:18:27
【问题描述】:
我正在尝试创建一个带有底部导航的应用,可以在多个片段之间切换。
在其中一个中,我需要在recyclerview 中列出数据。我对 android 比较陌生,我之前从未使用过 recyclerview 或 ViewModels 或 Fragments,所以我不能 100% 确定我这样做是否正确。
这是我现在拥有的:
Fragment.java
public class twoFragment extends Fragment implements LifecycleOwner {
private twoViewModel twoViewModel;
private RecyclerView recyclerView;
private RecyclerViewAdapter recyclerViewAdapter;
public View onCreateView(@NonNull LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
twoViewModel = new ViewModelProvider(this).get(twoViewModel.class);
View root = inflater.inflate(R.layout.two, container, false);
recyclerView = root.findViewById(R.id.rv_main);
recyclerView.setHasFixedSize(true);
twoViewModel.getUserMutableLiveData().observe(getViewLifecycleOwner(), userListUpdateObserver);
return root;
}
private Observer<ArrayList<User>> userListUpdateObserver = new Observer<ArrayList<User>>() {
@Override
public void onChanged(ArrayList<User> userArrayList) {
recyclerViewAdapter = new RecyclerViewAdapter(requireActivity(),userArrayList);
recyclerView.setAdapter(recyclerViewAdapter);
}
};
}
ViewModel.java
public class twoViewModel extends ViewModel {
MutableLiveData<ArrayList<User>> userLiveData;
ArrayList<User> userArrayList;
public twoViewModel() {
userLiveData = new MutableLiveData<>();
// call your Rest API in init method
init();
}
public MutableLiveData<ArrayList<User>> getUserMutableLiveData() {
return userLiveData;
}
public void init(){
populateList();
userLiveData.setValue(userArrayList);
}
public void populateList(){
User user = new User();
user.setTitle("Darknight");
user.setDescription("Best video ever!");
userArrayList = new ArrayList<>();
userArrayList.add(user);
userArrayList.add(user);
userArrayList.add(user);
userArrayList.add(user);
userArrayList.add(user);
userArrayList.add(user);
}
}
RecyclerViewAdapter.java
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
Activity context;
ArrayList<User> userArrayList;
public RecyclerViewAdapter(Activity context, ArrayList<User> userArrayList) {
this.context = context;
this.userArrayList = userArrayList;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View rootView = LayoutInflater.from(context).inflate(R.layout.item,parent,false);
System.out.println("onCreateViewHolder");
return new RecyclerViewViewHolder(rootView);
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
User user = userArrayList.get(position);
RecyclerViewViewHolder viewHolder= (RecyclerViewViewHolder) holder;
viewHolder.txtView_title.setText(user.getTitle());
viewHolder.txtView_description.setText(user.getDescription());
viewHolder.imgView_icon.setImageDrawable(user.getImgIcon());
System.out.println("onBindViewHolder");
}
@Override
public int getItemCount() {
return userArrayList.size();
}
class RecyclerViewViewHolder extends RecyclerView.ViewHolder {
ImageView imgView_icon;
TextView txtView_title;
TextView txtView_description;
public RecyclerViewViewHolder(@NonNull View itemView) {
super(itemView);
imgView_icon = itemView.findViewById(R.id.imgView_icon);
txtView_title = itemView.findViewById(R.id.txtView_title);
txtView_description = itemView.findViewById(R.id.txtView_description);
System.out.println("RecyclerViewViewHolder");
}
}
}
问题
使用此代码,当我打开应用程序时,recyclerview为空。但是,当我单击片段中的EditText 视图时,数据会出现在recyclerview 中。然后,当我离开片段并返回它时,它是空的。
我在这里做错了什么?
我在某处读到过你不应该同时使用 ViewModels 和 recyclerviews...这是如何工作的?
【问题讨论】:
标签: java android android-fragments model-view-controller android-recyclerview