【问题标题】:RecyclerView Adapter Null Parameter in constructor构造函数中的 RecyclerView Adapter Null 参数
【发布时间】: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


【解决方案1】:

所以在 cmets 中讨论之后,帮助制定一种方法来更新适配器中的 me 变量:

updateMe(Users me){ this.me = me; }

每当me 发生变化时从片段中调用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    相关资源
    最近更新 更多