【发布时间】:2020-05-20 19:51:17
【问题描述】:
当我尝试在Adapter 中访问它时,我可以解释为什么我传递给我的RecyclerViewAdapter 的参数之一为空吗?我一直在查看片段生命周期,但我似乎无法理解导致它为空的原因。
在onCreateView() 我有:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_message, container, false);
mFirestore = FirebaseFirestore.getInstance();
String user_id = mAuth.getCurrentUser().getUid();;
mUsersListView = view.findViewById(R.id.users_list);
usersList = new ArrayList<>();
usersRecyclerAdapter = new UsersRecyclerAdapter(container.getContext(), usersList, me);
mUsersListView.setHasFixedSize(true);
mUsersListView.setLayoutManager(new LinearLayoutManager(container.getContext()));
mUsersListView.setAdapter(usersRecyclerAdapter);
return view;
}
在onStart():
@Override
public void onStart() {
super.onStart();
usersList.clear();
mFirestore.collection("Users").addSnapshotListener(getActivity(), (documentSnapshots, e) -> {
for (DocumentChange documentChange : documentSnapshots.getDocumentChanges()) {
if (documentChange.getType() == DocumentChange.Type.ADDED) {
String user_id = documentChange.getDocument().getId();
if (mAuth.getCurrentUser().getUid().matches(user_id)) {
me = documentChange.getDocument().toObject(Users.class).withId(user_id);
System.out.println(me.getName()); //prints out a name
usersRecyclerAdapter.notifyDataSetChanged();
} else {
Users users = documentChange.getDocument().toObject(Users.class).withId(user_id);
usersList.add(users);
usersRecyclerAdapter.notifyDataSetChanged();
}
}
}
});
}
我的适配器类看起来像这样
public class UsersRecyclerAdapter extends RecyclerView.Adapter<UsersRecyclerAdapter.ViewHolder> {
private List<Users> usersList;
private Context context;
private Users me;
public UsersRecyclerAdapter(Context context, List<Users> usersList, Users me) {
this.usersList = usersList;
this.context = context;
this.me = me;
System.out.println(me.getName()); //this outputs null
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
//
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
//
}
}
我想保留me 对象的引用并将其传递给我的适配器。但是,当我尝试在那里访问它时,它会触发NullPointerException。该列表很好,但可以访问。怎么会?
【问题讨论】:
-
在将
me传递给适配器之前,您是否对其进行了实例化? -
@MohamedHamza 是的,我做到了。我宣布它的地方。用户我 = 新用户();但是,调用适配器中的访问器,返回 null。如果我在将 documentChange 设置为“我”的片段中调用访问器,它们会为我提供实际数据。
-
我的适配器可能有问题?我应该发布那个吗?
-
所以尝试在适配器中创建一个新方法,以用户变量作为参数,类似于 updateMe(Users me){ this.me = me; },在让我进入片段后,调用该方法:adapter.updateme(me).. 请原谅移动输入
-
完美。不知道为什么我没有想到这一点。感谢@MohamedHamza 现在可以使用了
标签: java android nullpointerexception