0 Daumen
528 Aufrufe

Ich arbeite an der Möglichkeit per Suche Nutzer anzeigen zu lassen, vergleichbar wie bei allen sozialen Plattformen.

Aber es zeigt mir einfach alle Nutzer an. Egal, welcher Buchstabe, alle Nutzer werden angezeigt und ich verstehe nicht wieso, weshalb.

Ich möchte lediglich, dass Nutzer eingeblendet werden sollen, die genau die, i.d. Suche, eingetippten Buchstaben enthält.

Leider ist das von mir genutzte Tutorial etwas veraltet und Android Studio erhielt Updates, weshalb der Code nicht mehr funktioniert. Ob mir eventuell genau ein ähnliches Codeteil, wie dieser fehlt, weshalb es nicht so funktioniert, wie ich will?

Query searchFriendsQuery = allUsersDatabaseRef.orderByChild("username")
.startAt(searchBoxInput).endAt(searchBoxInput + "\uf8ff);

Wie löse ich es aber mit meinem Code, der obere Teil funktioniert nicht mehr.


Mein Code für diese Activity:


public class FindFriends {

  public String profileimage, username, fullname;

  public FindFriends() {
  }

  public FindFriends(String profileimage, String username, String fullname) {
      this.profileimage = profileimage;
      this.username = username;
      this.fullname = fullname;
  }

  public String getProfileimage() {
      return profileimage;
  }

  public void setProfileimage(String profileimage) {
      this.profileimage = profileimage;
  }

  public String getUsername() {
      return username;
  }

  public void setUsername(String username) {
      this.username = username;
  }

  public String getFullname() {
      return fullname;
  }

  public void setFullname(String fullname) {
      this.fullname = fullname;
  }
}

import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.TextView;

import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.squareup.picasso.Picasso;

import de.hdodenhof.circleimageview.CircleImageView;

public class FindFriendsActivity extends AppCompatActivity {

  private Toolbar mToolbar;

  public ImageButton SearchButton;
  public EditText SearchInputText;

  private RecyclerView SearchResultList;
  private DatabaseReference allUsersDatabaseRef;


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

      allUsersDatabaseRef = FirebaseDatabase.getInstance().getReference().child("Users");

      mToolbar = findViewById(R.id.find_friends_bar_layout);
      setSupportActionBar(mToolbar);
      getSupportActionBar().setDisplayHomeAsUpEnabled(true);
      getSupportActionBar().setDisplayShowTitleEnabled(false);

      SearchResultList = findViewById(R.id.search_result_list);
      SearchResultList.setHasFixedSize(true);
      SearchResultList.setLayoutManager(new LinearLayoutManager(this));

      SearchButton = findViewById(R.id.search_people_friends_button);
      SearchInputText = findViewById(R.id.search_box_input);

      SearchButton.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              String searchBoxInput = SearchInputText.getText().toString();

              SearchPeopleAndFriends(searchBoxInput);
          }
      });

  }

  private void SearchPeopleAndFriends(String searchBoxInput) {

      FirebaseRecyclerOptions<FindFriends> options = new FirebaseRecyclerOptions.Builder<FindFriends>().
              setQuery(allUsersDatabaseRef, FindFriends.class).build();

      FirebaseRecyclerAdapter<FindFriends, FindFriendsActivity.FindFriendsViewHolder> adapter = new FirebaseRecyclerAdapter<FindFriends, FindFriendsViewHolder>(options) {
          @Override
          protected void onBindViewHolder(@NonNull FindFriendsActivity.FindFriendsViewHolder holder, int position, @NonNull FindFriends model) {

              final String PostKey = getRef(position).getKey();
              holder.username.setText(model.getUsername());
              holder.fullname.setText(model.getFullname());

              Picasso.get().load(model.getProfileimage()).into(holder.profileimage);

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

                      Intent findFriendsIntent = new Intent(FindFriendsActivity.this, FindFriendsActivity.class);
                      findFriendsIntent.putExtra("PostKey", PostKey);
                      startActivity(findFriendsIntent);
                  }
              });
          }

          @NonNull
          @Override
          public FindFriendsActivity.FindFriendsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {

              View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.all_users_display_layout, viewGroup, false);

              FindFriendsActivity.FindFriendsViewHolder viewHolder = new FindFriendsActivity.FindFriendsViewHolder(view);
              return viewHolder;
          }
      };

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

  public static class FindFriendsViewHolder extends RecyclerView.ViewHolder {

      TextView username, fullname;
      CircleImageView profileimage;

      public FindFriendsViewHolder(@NonNull View itemView) {
          super(itemView);

          username = itemView.findViewById(R.id.all_users_profile_username);
          fullname = itemView.findViewById(R.id.all_users_fullname);
          profileimage = itemView.findViewById(R.id.all_users_profile_image);

      }
  }


}

Avatar von

1 Antwort

0 Daumen

Antwort mit KI erzeugt

Lösung des Problems

Das Problem, das du beschreibst, liegt darin, dass deine Suchanfrage an Firebase nicht korrekt konfiguriert ist, um nur Nutzer anzuzeigen, deren Benutzername die in der Suchbox eingegebenen Buchstaben enthält. Dein aktueller Code setQuery(allUsersDatabaseRef, FindFriends.class) im SearchPeopleAndFriends-Methode holt einfach alle Nutzer ohne jegliche Filterung basierend auf der Sucheingabe.

Um das gewünschte Verhalten zu erzielen, musst du deine setQuery-Methode so ändern, dass sie eine entsprechende Anfrage an Firebase sendet, die auf deiner Suche basiert. Hier nutzt man in der Regel startAt() und endAt() Methoden mit dem Suchbegriff, ähnlich wie du es im ersten Codebeispiel gezeigt hast. Allerdings scheint es, als ob dieser Teil deines Codes korrekt ist, aber er wird aktuell nicht in der SearchPeopleAndFriends-Methode verwendet.

Siehe eine korrigierte Version der SearchPeopleAndFriends-Methode unten:

java
private void SearchPeopleAndFriends(String searchBoxInput) {
  Query searchQuery = allUsersDatabaseRef.orderByChild("username").startAt(searchBoxInput).endAt(searchBoxInput + "\uf8ff");

  FirebaseRecyclerOptions<FindFriends> options =
          new FirebaseRecyclerOptions.Builder<FindFriends>()
                  .setQuery(searchQuery, FindFriends.class)
                  .build();

  FirebaseRecyclerAdapter<FindFriends, FindFriendsViewHolder> adapter = new FirebaseRecyclerAdapter<FindFriends, FindFriendsViewHolder>(options) {
    @Override
    protected void onBindViewHolder(@NonNull FindFriendsViewHolder holder, int position, @NonNull FindFriends model) {
      final String PostKey = getRef(position).getKey();
      holder.username.setText(model.getUsername());
      holder.fullname.setText(model.getFullname());
      Picasso.get().load(model.getProfileimage()).into(holder.profileimage);

      holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
          Intent findFriendsIntent = new Intent(FindFriendsActivity.this, FindFriendsActivity.class);
          findFriendsIntent.putExtra("PostKey", PostKey);
          startActivity(findFriendsIntent);
        }
      });
    }

    @NonNull
    @Override
    public FindFriendsViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
      View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.all_users_display_layout, viewGroup, false);
      return new FindFriendsViewHolder(view);
    }
  };

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


In diesem Code-Snippet wird searchQuery verwendet, um eine Query zu erstellen, die nur Benutzer zurückgibt, deren Benutzernamen mit den eingegebenen Buchstaben beginnen. Dieses Query-Objekt wird dann verwendet, um die FirebaseRecyclerOptions zu konfigurieren. Durch diese Änderung sollte dein Code nun korrekt funktionieren und nur die Nutzer anzeigen, die den eingegebenen Suchebedingungen entsprechen.
Avatar von

Ein anderes Problem?

Stell deine Frage

Ähnliche Fragen

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community