firebase - 尝试在空对象引用上调用虚拟方法“java.lang.String com.practice.projectbm.Model.User.getName()”
问题描述
在此处输入图像描述我正在尝试从具有名为 EmailUsers 的子项的 firebase 数据库中获取数据,该子项由名称、电子邮件、生物等组成。我想在我的 xml 视图中显示这些项目。但是我收到了标题中提到的错误。这是我的 ProfileFragment.java
public class ProfileFragment extends Fragment
{
ImageView back_button_to_feed, share, settings;
private CircleImageView profile_photo;
private int SELECT_PICTURE = 1;
private Uri imageUri;
private TextView ques;
private TextView followers;
private TextView following;
private Button editprof;
private TextView username;
private TextView bioo;
private FirebaseUser fire;
String profileId;
public interface ProfileFragmentCallback
{
public void onSettingsClicks();
}
public static ProfileFragmentCallback profileFragmentCallback;
public static ProfileFragment GetInstance(ProfileFragmentCallback callback)
{
profileFragmentCallback = callback;
return new ProfileFragment();
}
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
public ProfileFragment() {
// Required empty public constructor
}
public static ProfileFragment newInstance(String param1, String param2) {
ProfileFragment fragment = new ProfileFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View view = inflater.inflate(R.layout.profile_fragment, container, false);
//Mapping
back_button_to_feed = view.findViewById(R.id.back_arrow);
profile_photo = view.findViewById(R.id.profile_picture);
share = view.findViewById(R.id.share_profile);
settings = view.findViewById(R.id.settings_in_profile);
username = view.findViewById(R.id.account_username);
bioo = view.findViewById(R.id.bio);
followers = view.findViewById(R.id.followers);
following = view.findViewById(R.id.following);
editprof = view.findViewById(R.id.edit_details);
fire = FirebaseAuth.getInstance().getCurrentUser();
profileId = fire.getUid();
//Mapping Ends
//If user clicks on back button we'll take him to feed
back_button_to_feed.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
getActivity().onBackPressed();
}
});
//If user clicks on back button we'll take him to feed Ends
//If user clicks on share
share.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_SUBJECT, "Hey Check Out My Profile");
intent.putExtra(Intent.EXTRA_TEXT, "https://youtube.com");
startActivity(Intent.createChooser(intent, "Share via"));
}
});
//If user clicks on share Ends
//If user clicks on settings
settings.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
profileFragmentCallback.onSettingsClicks();
}
});
//If user clicks on settings Ends
//for image selection
profile_photo.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//LOGIC FOR PROFILE PICTURE
openImageChooser();
}
});
//for image selection Ends
userInfo();
getFollowersAndFollowingCount();
// Inflate the layout for this fragment
return view;
// Inflate the layout for this fragment Ends
}
private void getFollowersAndFollowingCount()
{
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("Follow").child(profileId);
ref.child("Followers").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot)
{
followers.setText(" " + snapshot.getChildrenCount());
}
@Override
public void onCancelled(@NonNull DatabaseError error)
{
}
});
ref.child("Following").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot)
{
following.setText(" " + snapshot.getChildrenCount());
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
private void userInfo()
{
FirebaseDatabase.getInstance().getReference().child("EmailUsers").child(profileId).addValueEventListener(new ValueEventListener()
{
@Override
public void onDataChange(@NonNull DataSnapshot snapshot)
{
User user = snapshot.getValue(User.class);
username.setText(user.getName());
bioo.setText(user.getBio());
}
@Override
public void onCancelled(@NonNull DatabaseError error)
{
}
});
}
void openImageChooser() {
Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_PICTURE);
}
}
这是我的用户模型类
public class User
{
private String name;
private String email;
private String bio;
private String Imageurl;
private String id;
public User()
{
}
public User(String name, String email, String bio, String imageurl, String id) {
this.name = name;
this.email = email;
this.bio = bio;
Imageurl = imageurl;
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getBio() {
return bio;
}
public void setBio(String bio) {
this.bio = bio;
}
public String getImageurl() {
return Imageurl;
}
public void setImageurl(String imageurl) {
Imageurl = imageurl;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
这是我的用户适配器
public class UserAdapter extends RecyclerView.Adapter<UserAdapter.ViewHolder>
{
private Context mContext;
private List<User> mUsers;
private boolean isFragment;
private FirebaseUser firebaseUser;
public UserAdapter(Context mContext, List<User> mUsers, boolean isFragment)
{
this.mContext = mContext;
this.mUsers = mUsers;
this.isFragment = isFragment;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mContext).inflate(R.layout.user_item, parent, false);
return new UserAdapter.ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull UserAdapter.ViewHolder holder, int position)
{
firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
User user = mUsers.get(position);
holder.followw.setVisibility(View.VISIBLE);
holder.uname.setText(user.getName());
Picasso.get().load(user.getImageurl()).placeholder(R.mipmap.ic_launcher).into(holder.imageProfile);
isFollowed(user.getId(), holder.followw);
if(user.getId().equals(firebaseUser.getUid()))
{
holder.followw.setVisibility(View.GONE);
}
holder.followw.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(holder.followw.getText().toString().equals("Follow"))
{
FirebaseDatabase.getInstance().getReference().child("Follow").child(firebaseUser.getUid()).child("Following").child(user.getId()).setValue(true);
FirebaseDatabase.getInstance().getReference().child("Follow").child(user.getId()).child("Followers").child(firebaseUser.getUid()).setValue(true);
}
else
{
FirebaseDatabase.getInstance().getReference().child("Follow").child(firebaseUser.getUid()).child("Following").child(user.getId()).removeValue();
FirebaseDatabase.getInstance().getReference().child("Follow").child(user.getId()).child("Followers").child(firebaseUser.getUid()).removeValue();
}
}
});
}
private void isFollowed(String id, Button followw)
{
DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Follow").child(firebaseUser.getUid()).child("Following");
reference.addValueEventListener(new ValueEventListener()
{
@Override
public void onDataChange(@NonNull DataSnapshot snapshot)
{
if(snapshot.child(id).exists())
{
followw.setText("Following");
}
else
{
followw.setText("Follow");
}
}
@Override
public void onCancelled(@NonNull DatabaseError error)
{
}
});
}
@Override
public int getItemCount()
{
return mUsers.size();
}
public class ViewHolder extends RecyclerView.ViewHolder
{
public CircleImageView imageProfile;
public TextView uname;
public Button followw;
public ViewHolder(@NonNull View itemView)
{
super(itemView);
imageProfile = itemView.findViewById(R.id.image_profile);
uname = itemView.findViewById(R.id.fullname);
followw = itemView.findViewById(R.id.follow);
}
}
}
解决方案
我认为为您的 onClick 方法设置 Override 是不正确的。您不是简单地为您创建的按钮调用现有方法吗?覆盖超类方法的实现时使用注释,但您不是指标准的点击事件吗?不知道这是否能解决你的问题。您是否测试过您在方法之间传递的变量的结果?由于调用用户对象时会出现空指针错误,因此我将首先查看更密切相关的主题,例如 useradapter。
在您的用户适配器类中
System.out.println(view) //Check to see if this is what you were expecting
return new UserAdapter.ViewHolder(view);
System.out.println(holder) //Check to see if this is what you were expecting
User user = mUsers.get(position);
holder.followw.setVisibility(View.VISIBLE);
holder.uname.setText(user.getName());
然后跟踪代码中相关的实例,例如当您设置视图时,并进行更多检查。
View view = inflater.inflate(R.layout.profile_fragment, container, false);
//Mapping
System.out.println(view) //another check
back_button_to_feed = view.findViewById(R.id.back_arrow);
profile_photo = view.findViewById(R.id.profile_picture);
share = view.findViewById(R.id.share_profile);
settings = view.findViewById(R.id.settings_in_profile);
username = view.findViewById(R.id.account_username);
bioo = view.findViewById(R.id.bio);
followers = view.findViewById(R.id.followers);
following = view.findViewById(R.id.following);
editprof = view.findViewById(R.id.edit_details);
fire = FirebaseAuth.getInstance().getCurrentUser();
profileId = fire.getUid();
祝你好运!
推荐阅读
- ios - 应用拒绝 - 儿童类别
- ios - 将多个请求合并为一个。将 observable 数组转换为数组的 observable
- mysql - 从派生表名中返回所有也有 IN 语句的记录
- c# - 在 WPF XAML 中,如何动态创建与索引属性的双向绑定?
- java - 拖动视图 onLongClick 并启动活动 onClick
- kubernetes - Kubernetes 节点内存限制
- javascript - 使用 Node Selenium 下载 Excel 文件
- shell - 用于创建 Hive 表的 Shell 脚本
- python - 无法设置竞争条件,我的代码是否按顺序运行?
- python - 如何在python环境中的linux文件中的特定模式或行号之后添加多行