当我点击我的应用程序中的注册用户片段时应用程序崩溃..其中包含recyclerview

Posted

技术标签:

【中文标题】当我点击我的应用程序中的注册用户片段时应用程序崩溃..其中包含recyclerview【英文标题】:App crash when i click on the registered user fragment in my app .. which contains the recyclerview 【发布时间】:2020-12-18 08:49:57 【问题描述】:

我正在尝试获取在我的应用上注册并存储在 Firebase 数据库中的所有用户。我编写了以下代码。但是当我运行应用程序并单击注册用户片段(New_regActivity)时,它不显示任何内容,并且大多数情况下应用程序崩溃 将显示所有用户的主要活动是这样编码的

    public class New_regActivity extends Fragment 
    RecyclerView recyclerView;
    AdapterUsers adapterUsers;
    List<User> userList;

@Nullable
@Override
public View onCreateView(final LayoutInflater inflater, @NonNull ViewGroup Container, @NonNull Bundle savedInstanceState) 
    View view = inflater.inflate(R.layout.activity_newreg, Container, false);
    recyclerView=view.findViewById(R.id.recycler_view1);
    recyclerView.setHasFixedSize(true);
    userList = new ArrayList<>();
    adapterUsers= new AdapterUsers(getActivity(),userList);
    recyclerView.setAdapter(adapterUsers);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    getAllUsers();

    return view;


private void getAllUsers() 
    final FirebaseUser firebaseUser= 
    FirebaseAuth.getInstance().getCurrentUser();
    DatabaseReference reference = 
    FirebaseDatabase.getInstance().getReference("Users");
    reference.addValueEventListener(new ValueEventListener() 
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) 
            userList.clear();
            for (DataSnapshot ds: dataSnapshot.getChildren())
                User users = ds.getValue(User.class);
                if (users.getUid().equals(firebaseUser.getUid()))
                    userList.add(users);
                
                adapterUsers = new AdapterUsers(getActivity(),userList);
                recyclerView.setAdapter(adapterUsers);
            
        

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) 

        
    );

而 AdapterUsers 类是这样写的

    public class AdapterUsers extends 
RecyclerView.Adapter<AdapterUsers.MyHolder> 
Context context;
List<User> userList;

public AdapterUsers(Context context, List<User> userList) 
    this.context = context;
    this.userList = userList;


@NonNull
@Override
public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) 
    View view = 
    LayoutInflater.from(context).inflate(R.layout.row,parent,false);
    return new MyHolder(view);


@Override
public void onBindViewHolder(@NonNull MyHolder holder, int position) 
    String fullname= userList.get(position).getName();
    String username= userList.get(position).getUser_Name();
    final String email= userList.get(position).getEmail_Address();

    holder.mNameTV.setText(fullname);
    holder.mUsernameTV.setText(username);
    holder.mEmailTV.setText(email);

    holder.itemView.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            Toast.makeText(context,""+email,Toast.LENGTH_LONG).show();

        
    );



@Override
public int getItemCount() 
       return userList.size();


class MyHolder extends RecyclerView.ViewHolder
    TextView mNameTV,mEmailTV,mUsernameTV;

    public MyHolder(@NonNull View itemView) 
        super(itemView);
        mNameTV=itemView.findViewById(R.id.NameTV);
        mEmailTV=itemView.findViewById(R.id.Email_AddressTV);
        mUsernameTV=itemView.findViewById(R.id.User_NameTV);
    

我制作的模型类是

    public class User 
public String Name, User_Name, Email_Address,uid;

public User() 



public User(String name, String user_Name, String email_Address, String uid) 
    Name = name;
    User_Name = user_Name;
    Email_Address = email_Address;
    this.uid = uid;


public String getName() 
    return Name;


public void setName(String name) 
    Name = name;


public String getUser_Name() 
    return User_Name;


public void setUser_Name(String user_Name) 
    User_Name = user_Name;


public String getEmail_Address() 
    return Email_Address;


public void setEmail_Address(String email_Address) 
    Email_Address = email_Address;


public String getUid() 
    return uid;


public void setUid(String uid) 
    this.uid = uid;

我在 logcat 部分得到以下异常和错误

    2020-08-30 14:54:29.195 13312-13312/com.shadab.login E/androidRuntime: 
FATAL EXCEPTION: main
Process: com.shadab.login, PID: 13312
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean  
 .lang.String.equals(java.lang.Object)' on a null object reference
    at com.shadab.login.java.New_regActivity$1.onDataChange(New_regActivity.java:56)
    at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@19.2.1:75)
    at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@19.2.1:63)
    at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@19.2.1:55)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7356)
    at java.lang.reflect.Method.invoke(Native Method)


The line 56 is 

    if (!(user.getUid()).equals(firebaseUser.getUid()))
    

【问题讨论】:

如果应用程序崩溃,会有一个堆栈跟踪。请在 logcat 上查找,并将其添加到您的问题中。 表示适配器未连接到recyclerview 这不是错误,而是警告。如果应用程序崩溃,您应该得到一个异常。请找到它并将其添加到您的问题中。 是的,我现在在问题中添加了例外 请将您的数据库结构添加为 JSON 文件或至少是屏幕截图。 【参考方案1】:

在所有字段上使用 this 并像这样重构您的代码。

public class User 
public String name, userName, emailAddress, uid;

public User() 



public User(String name, String userName, String emailAddress, String uid) 
    this.name = name;
    this.userName = userName;
    this.emailAddress = emailAdress;
    this.uid = uid;


public String getName() 
    return this.name;


public void setName(String name) 
    this.name = name;


public String getUserName() 
    return this.userName;


public void setUser_Name(String userName) 
    this.userName = userName;


public String getEmailAddress() 
    return this.emailAddress;


public void setEmailAddress(String emailAddress) 
    Email_Address = email_Address;


public String getUid() 
    return uid;


public void setUid(String uid) 
    this.uid = uid;

【讨论】:

我已经解决了..但是现在出现了一些其他类型的错误..我在问题中提到了..请检查它

以上是关于当我点击我的应用程序中的注册用户片段时应用程序崩溃..其中包含recyclerview的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试登录注册用户并通过解析启用推送通知时,我的应用程序崩溃

片段中的 EditText 上的空指针异常 [重复]

当我点击播放按钮更多然后在我的MP3播放器中我的应用程序崩溃

切换onCheckedChangedListner不在工具栏菜单中注册点击

Android - 应用程序启动时片段 onCreate 崩溃

将片段与 GoogleMap 一起使用时应用程序崩溃