java - Firestore ui 适配器错误 java.lang.NullPointerException : 'void com. firebase.ui.firestore.FirestoreRecyclerAdapter.startListening()

标签 java android firebase google-cloud-firestore

firestore 回收器适配器 没有获取任何数据,我发现了上述错误。我搜索过,但没有人给出明确的答案。

  • 我使用 EditText 和图像按钮进行搜索。
  • 我正在使用身份验证,因此我不会这样做,这是否会影响我的 回收适配器。
  • 如果 request.auth !=null,则 Firebase 规则设置为:读取、写入 因为我有身份验证。

这是代码:

public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
 private FirebaseAuth mAuth;
 private FirebaseFirestore mFirestore;
 private CircleImageView mProfileimage;
 private TextView mProfilepsuedo, mProfileEmail;
 private String mUserID;
 private EditText searchID;
 private ImageButton searchbtn;
 private RecyclerView pharmacienlist;
 private FirestoreRecyclerAdapter < Pharmacien, PharmacieViewHolder > myadapter;


 @Override
 protected void onStart() {
  super.onStart();
  FirebaseUser mCurrentuser = mAuth.getCurrentUser();
  if (mCurrentuser == null) {
   sendTologin();
  }
  myadapter.startListening();

 }

 @Override
 protected void onStop() {
  super.onStop();
  myadapter.stopListening();
 }

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  mFirestore = FirebaseFirestore.getInstance();
  mAuth = FirebaseAuth.getInstance();
  searchID = (EditText) findViewById(R.id.SearchID);
  searchbtn = (ImageButton) findViewById(R.id.search_go_btn);
  pharmacienlist = (RecyclerView) findViewById(R.id.listpharmacies);

  Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
  setSupportActionBar(toolbar);

  searchbtn.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {

    String searchquery = searchID.getText().toString();
    firebasePharmaciesearch(searchquery);
   }
  });

  FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
  fab.setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View view) {
    Intent photointent = new Intent(MainActivity.this, PhotoActivity.class);
    startActivity(photointent);
   }
  });

  DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
  ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
   this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
  drawer.addDrawerListener(toggle);
  toggle.syncState();

  NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
  navigationView.setNavigationItemSelectedListener(this);
 }

 private void firebasePharmaciesearch(String searchquery) {
  Toast.makeText(this, "La recherche est en cours", Toast.LENGTH_SHORT).show();
  Query query = FirebaseFirestore.getInstance()
   .collection("Pharmaciens")
   .orderBy("AdressePH")
   .limit(10).startAt(searchquery).endAt("\u8fff");
  FirestoreRecyclerOptions < Pharmacien > options = new FirestoreRecyclerOptions.Builder < Pharmacien > ()
   .setQuery(query, Pharmacien.class)
   .build();
  myadapter = new FirestoreRecyclerAdapter < Pharmacien, PharmacieViewHolder > (options) {
   @NonNull
   @Override
   public PharmacieViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext())
     .inflate(R.layout.listlayout, parent, false);
    return new PharmacieViewHolder(view);
   }

   @Override
   protected void onBindViewHolder(@NonNull PharmacieViewHolder holder, int position, @NonNull Pharmacien model) {
    holder.setName(model.getNomSiege());
    holder.setAdresse(model.getAdressePH());
    holder.setDistance(String.valueOf(model.getPosition().getLatitude()));
    holder.setUserImage(model.getImageURL(), getApplicationContext());

    //to get key

    holder.mView.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View view) {

     }
    });
   }

  };
  pharmacienlist.setAdapter(myadapter);
 }

 @Override
 public void onBackPressed() {
  DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
  if (drawer.isDrawerOpen(GravityCompat.START)) {
   drawer.closeDrawer(GravityCompat.START);
  } else {
   super.onBackPressed();
  }
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  mUserID = mAuth.getCurrentUser().getUid();
  mProfileimage = (CircleImageView) findViewById(R.id.Clientprofile_id);
  mProfilepsuedo = (TextView) findViewById(R.id.Clientpseudo_id);
  mProfileEmail = (TextView) findViewById(R.id.ClientEmail_id);

  getMenuInflater().inflate(R.menu.main, menu);

  mFirestore.collection("Clients").document(mUserID).get().addOnSuccessListener(new OnSuccessListener < DocumentSnapshot > () {
   @Override
   public void onSuccess(DocumentSnapshot documentSnapshot) {
    String pseudo = documentSnapshot.getString("Pseudo");
    String Email = documentSnapshot.getString("Email");
    String user_image = documentSnapshot.getString("Image");
    mProfilepsuedo.setText(pseudo);
    mProfileEmail.setText(Email);
    RequestOptions placheholder = new RequestOptions();
    placheholder.placeholder(R.drawable.loginimage);
    Glide.with(MainActivity.this).setDefaultRequestOptions(placheholder).load(user_image).into(mProfileimage);
   }
  });
  return true;
 }

 @Override
 public boolean onOptionsItemSelected(MenuItem item) {
  // Handle action bar item clicks here. The action bar will
  // automatically handle clicks on the Home/Up button, so long
  // as you specify a parent activity in AndroidManifest.xml.
  int id = item.getItemId();

  //noinspection SimplifiableIfStatement
  if (id == R.id.action_settings) {
   return true;
  }

  return super.onOptionsItemSelected(item);
 }

 @SuppressWarnings("StatementWithEmptyBody")
 @Override
 public boolean onNavigationItemSelected(MenuItem item) {
  // Handle navigation view item clicks here.
  int id = item.getItemId();

  if (id == R.id.nav_gallery) {
   // Handle the gallery action
  } else if (id == R.id.nav_profile) {
   //handle the profile action
   Intent profileintent = new Intent(MainActivity.this, Profileactivity.class);
   startActivity(profileintent);

  } else if (id == R.id.nav_logout) {
   //handle the logout action
   AlertDialog.Builder a_builder = new
   AlertDialog.Builder(MainActivity.this);
   a_builder.setMessage("Voulez-vous déconnecter?")
    .setCancelable(false)
    .setPositiveButton("Oui", new DialogInterface.OnClickListener() {
     @Override
     public void onClick(DialogInterface dialog, int which) {
      mAuth.signOut();
      Intent loginIntent = new Intent(MainActivity.this, LoginActivity.class);
      startActivity(loginIntent);
      Toast.makeText(MainActivity.this, "Déconnexion réussite", Toast.LENGTH_SHORT).show();
     }
    })
    .setNegativeButton("Non", new DialogInterface.OnClickListener() {
     @Override
     public void onClick(DialogInterface dialog, int which) {
      dialog.cancel();
     }
    });
   AlertDialog alert = a_builder.create();
   alert.setTitle("Deconnexion");
   alert.show();
  }

  DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
  drawer.closeDrawer(GravityCompat.START);
  return true;
 }
 private void sendTologin() {
  Intent loginintent = new Intent(MainActivity.this, LoginActivity.class);
  startActivity(loginintent);
  finish();
 }
 public class PharmacieViewHolder extends RecyclerView.ViewHolder {
  View mView;
  public PharmacieViewHolder(View itemView) {
   super(itemView);
   mView = itemView;

  }
  public void setName(String name) {
   TextView userNameView = (TextView) mView.findViewById(R.id.NomSiege);
   userNameView.setText(name);
  }
  public void setAdresse(String status) {
   TextView userAdresseView = (TextView) mView.findViewById(R.id.Adresseph);
   userAdresseView.setText(status);
  }
  public void setDistance(String distance) {
   TextView userdistanceView = (TextView) mView.findViewById(R.id.Distance);
   userdistanceView.setText(distance);
  }
  public void setUserImage(String ImageURL, Context ctx) {
   CircleImageView userImageView = (CircleImageView) mView.findViewById(R.id.ProfileImageID);
   Glide.with(ctx).load(ImageURL).into(userImageView);
  }

 }

}

更新 感谢您的帮助,我解决了 null 问题,我的另一个问题是我在 recyclerview 中没有得到任何结果。
这是 firestore ui 问题吗???;

以下是从 Firebase 获取信息的类:

public class Pharmacien  {
private String AdressePH,NomSiege,ImageURL;
private static String Type;
private Double Rating;
private GeoPoint Position;

public Pharmacien(String AdressePH, String NomSiege, String ImageURL, Double Rating, GeoPoint Position, String Type) {
    this.AdressePH = AdressePH;
    this.ImageURL = ImageURL;
    this.NomSiege = NomSiege;
    this.Position = Position;
    this.Rating = Rating;
    this.Type=Type;

}

public Pharmacien() {
}

public String getAdressePH() {
    return AdressePH;
}

public void setAdressePH(String adressePH) {
    AdressePH = adressePH;
}

public String getNomSiege() {
    return NomSiege;
}

public void setNomSiege(String nomSiege) {
    NomSiege = nomSiege;
}


public String getImageURL() {
    return ImageURL;
}

public void setImageURL(String imageURL) {
    ImageURL = imageURL;
}

public static String getType() {
    return Type;
}


public Double getRating() {
    return Rating;
}

public void setRating(Double ratingGlobal) {
    Rating = ratingGlobal;
}

public GeoPoint getPosition() {
    return Position;
}

public void setPosition(GeoPoint position) {
    Position = position;
}

}

解决方案 -_- 布局管理器就足够了 对于遇到此问题的每个人

 pharmacienlist.setHasFixedSize(true);
 pharmacienlist.setLayoutManager(new LinearLayoutManager(this)); 

最佳答案

它是 null,因为您在 onCreate() 内初始化了它,然后您在 onStart() 内编写了 myadapter.startListening();(位于 onCreate() 之前)

因此,要么在 onStart() 中初始化它:

@Override
protected void onStart() {
  super.onStart();
FirebaseUser mCurrentuser = mAuth.getCurrentUser();
if (mCurrentuser == null) {
    sendTologin();
}
myadapter = new FirestoreRecyclerAdapter<Pharmacien, PharmacieViewHolder>(options) {
 @NonNull
    @Override
    public PharmacieViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.listlayout, parent, false);
        return new PharmacieViewHolder(view);
    }

    @Override
    protected void onBindViewHolder(@NonNull PharmacieViewHolder holder, int position, @NonNull Pharmacien model) {
        holder.setName(model.getNomSiege());
        holder.setAdresse(model.getAdressePH());
        holder.setDistance(String.valueOf(model.getPosition().getLatitude()));
        holder.setUserImage(model.getImageURL(), getApplicationContext());

        //to get key



        holder.mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


            }
        });
    }

  };
 pharmacienlist.setAdapter(myadapter);
 myadapter.startListening();

  }
}

或者只需在 onCreate() 内的 pharmacienlist.setAdapter(myadapter); 之后添加 myadapter.startListening();

关于java - Firestore ui 适配器错误 java.lang.NullPointerException : 'void com. firebase.ui.firestore.FirestoreRecyclerAdapter.startListening(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50079411/

相关文章:

java - com.google.firebase.database.DatabaseException : Expected a Map while deserializing, 但得到了一个类 java.lang.Long

ios - 使用正确的身份验证数据时 Firebase 权限被拒绝(显然)

java - 当使包含 EJB 的模块成为另一个模块的依赖项时,@PostConstruct 方法被调用两次

java - JBoss 上 Flex/BlazeDS 的 Client.Error.MessageSend 问题

java - 如何将 BufferedReader 写入 slf4j 记录器

android - 在设备中运行 React Native 应用程序

android - Flutter:适用于 Windows 的 iOS 模拟器

java - 在Java中调用具有相同名称的方法内的另一个方法

android - 从 Wear 向手机 [MessageAPI] 发送消息时未收到消息

安卓。 Firebase crashlytics 解释