【问题标题】:Android Java - Variable 'adapter' might not have been initialisedAndroid Java - 变量“适配器”可能尚未初始化
【发布时间】:2020-07-02 07:23:42
【问题描述】:

我正在开发一个 Android 应用,其中 Firebase 实时数据库的详细信息将显示在 Recycler View 中。 我想让它像可扩展的recyclerview。 但是当我尝试使用我的适配器时出现错误。

变量“适配器”可能尚未初始化

    @Override
public void onStart() {
    super.onStart();
    FirebaseRecyclerOptions options =
            new FirebaseRecyclerOptions.Builder<Employee>()
                    .setQuery(mAttendanceDatabase, Employee.class)
                    .build();

    final FirebaseRecyclerAdapter<Employee, EmployeeViewHolder> adapter = new FirebaseRecyclerAdapter<Employee, EmployeeViewHolder>(options) {
                @Override
                protected void onBindViewHolder(@NonNull final EmployeeViewHolder holder, final int position, @NonNull Employee model) {
                    String employee_Id = getRef(position).getKey();
                    assert employee_Id != null;
                    mAttendanceDatabase.child(employee_Id).addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            String employee_Name = dataSnapshot.child("employeeName").getValue().toString();
                            holder.employeeName.setText(employee_Name);
                            holder.btn_viewMore.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {

                                    adapter.getItem(position);        //I'm getting error here

                                }
                            });

                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {
                            Toast.makeText(getContext(), "Some error occurred", Toast.LENGTH_SHORT).show();
                        }
                    });
                }

                @NonNull
                @Override
                public EmployeeViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.employee_view_layout, parent, false);
                    EmployeeViewHolder viewHolder = new EmployeeViewHolder(view);
                    return viewHolder;
                }
            };

    recyclerView.setAdapter(adapter);
    adapter.startListening();
}


    public static class EmployeeViewHolder extends RecyclerView.ViewHolder{
    TextView employeeName;
    ImageButton btn_viewMore;
    public EmployeeViewHolder(@NonNull View itemView) {
        super(itemView);
        employeeName = itemView.findViewById(R.id.employeeName_evl);
        btn_viewMore = itemView.findViewById(R.id.viewMoreBtn);
    }
}

我找不到任何合适的解决方案。帮我解决这个问题。

【问题讨论】:

  • 错误发生在哪一行代码?
  • @AlexMamo 错误发生在 onDataChange() 内部。我在发生错误的代码中添加了注释行。

标签: java android firebase-realtime-database android-recyclerview expandablerecyclerview


【解决方案1】:

尝试将适配器放在this 的变量中:

@Override
public void onStart() {
    super.onStart();
    FirebaseRecyclerOptions options =
            new FirebaseRecyclerOptions.Builder<Employee>()
                    .setQuery(mAttendanceDatabase, Employee.class)
                    .build();

    final FirebaseRecyclerAdapter<Employee, EmployeeViewHolder> adapter = new FirebaseRecyclerAdapter<Employee, EmployeeViewHolder>(options) {
                @Override
                protected void onBindViewHolder(@NonNull final EmployeeViewHolder holder, final int position, @NonNull Employee model) {
                    String employee_Id = getRef(position).getKey();
                    assert employee_Id != null;
                    final FirebaseRecyclerAdapter<Employee, EmployeeViewHolder> thisAdapter = this;
                    mAttendanceDatabase.child(employee_Id).addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            String employee_Name = dataSnapshot.child("employeeName").getValue().toString();
                            holder.employeeName.setText(employee_Name);
                            holder.btn_viewMore.setOnClickListener(new View.OnClickListener() {
                                @Override
                                public void onClick(View v) {

                                    thisAdapter.getItem(position);        //I'm getting error here

                                }
                            });

                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {
                            Toast.makeText(getContext(), "Some error occurred", Toast.LENGTH_SHORT).show();
                        }
                    });
                }

                @NonNull
                @Override
                public EmployeeViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
                    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.employee_view_layout, parent, false);
                    EmployeeViewHolder viewHolder = new EmployeeViewHolder(view);
                    return viewHolder;
                }
            };

    recyclerView.setAdapter(adapter);
    adapter.startListening();
}

编辑

为了支持我的案例,我做了一个最小的例子:

【讨论】:

  • 这不起作用。它会带来另一个错误cannot resolve symbol 'thisAdapter'
  • 真的,final FirebaseRecyclerAdapter thisAdapter = this; 没有错字?
  • @AsuwathamanRC 我手头没有 Android Studio,但我不敢相信 java 在那里的工作方式不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 2015-07-04
  • 1970-01-01
相关资源
最近更新 更多