Ошибка адаптера пользовательского интерфейса Firestore java.lang.NullPointerException: 'void com.firebase.ui.firestore.FirestoreRecyclerAdapter.startListening () - PullRequest
0 голосов
/ 28 апреля 2018

firestore recycler adapter не получает никаких данных. Я ловлю ошибку, указанную выше. Я искал, но никто не дал аккуратный ответ.

  • Я использую EditText и кнопку Image для поиска.
  • Я использую аутентификацию, поэтому не буду, если это повлияет на мой recycleradapter.
  • Правила firebase установлены на: read, write if: request.auth! = Null так как у меня есть аутентификация.

Вот код:

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);
  }

 }

}

Обновление Спасибо за вашу помощь. Я исправил нулевую проблему. Другая проблема в том, что я не получаю никаких результатов в своем обзоре утилит.
Это проблема пользовательского интерфейса firestore ????;

Вот класс, который получает информацию из 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)); 

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Это ноль, потому что вы инициализировали его внутри onCreate(), а затем написали myadapter.startListening(); внутри onStart(), что до 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();

  }
}

Или просто добавьте myadapter.startListening(); после pharmacienlist.setAdapter(myadapter); внутри onCreate()

0 голосов
/ 28 апреля 2018

Ваш myadapter.startListening(); вызывается, в то время как ваш myadapter все еще null в onStart. Вам нужно инициализировать его перед вызовом этого метода.

Этот код: myadapter = new FirestoreRecyclerAdapte... должен быть вызван до startListening

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...