FirebaseUI RecycleView搜索不工作

问题描述 投票:3回答:2

这里是我的SearchGetterSetter.java代码:

package com.me.Admin;

public class SearchGetterSetter {

String fname;

public SearchGetterSetter(String fname) {
    this.fname = fname;
}

public String getFname() {
    return fname;
}

public void setFname(String fname) {
    this.fname = fname;
}
}

这里是我的SearchUserActivity.java代码

package com.me.Admin;

  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.view.LayoutInflater;
  import android.view.View;
  import android.view.ViewGroup;
  import android.widget.EditText;
  import android.widget.ImageButton;
  import android.widget.TextView;
  import android.widget.Toast;

  import com.firebase.ui.database.FirebaseRecyclerAdapter;
  import com.firebase.ui.database.FirebaseRecyclerOptions;
  import com.google.firebase.FirebaseException;
  import com.google.firebase.database.DatabaseReference;
  import com.google.firebase.database.FirebaseDatabase;
  import com.google.firebase.database.Query;
  import com.infoters.killansfitnessstudio.R;
  public class SearchUserActivity extends AppCompatActivity {
private EditText SearchTxt;
private ImageButton SearchBtn;
private RecyclerView SearchRV;

private DatabaseReference mUserDatabase;

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

    mUserDatabase = FirebaseDatabase.getInstance().getReference("users");
    SearchTxt = findViewById(R.id.SearchUserTxt);
    SearchBtn = findViewById(R.id.SearchUserBtn);
    SearchRV = findViewById(R.id.SearchUserRV);
    SearchRV.setHasFixedSize(true);
    SearchRV.setLayoutManager(new LinearLayoutManager(this));


    SearchBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String searchText = SearchTxt.getText().toString();
            firebaseUserSearch(searchText);

        }
    });

}

private void firebaseUserSearch(String searchText) {

    Query firebaseSearchQuery = mUserDatabase.child("fname");

    FirebaseRecyclerOptions<SearchGetterSetter> response = new 
FirebaseRecyclerOptions.
            Builder<SearchGetterSetter> 
    ().setQuery(firebaseSearchQuery,SearchGetterSetter.class).build();
    FirebaseRecyclerAdapter<SearchGetterSetter,UserViewHolder> Fire = new 
FirebaseRecyclerAdapter<SearchGetterSetter, UserViewHolder>(response){
        @NonNull
        @Override
        public UserViewHolder onCreateViewHolder(@NonNull ViewGroup 
viewGroup, int i) {
            View view = LayoutInflater.from(viewGroup.getContext())
                    .inflate(R.layout.search_user_item, viewGroup, false);
            return new UserViewHolder(view);
        }
        @Override
        protected void onBindViewHolder(@NonNull UserViewHolder holder, int 
      position, @NonNull SearchGetterSetter model) {
            holder.fName.setText(model.getFname());
        }

    };

    Fire.notifyDataSetChanged();
    SearchRV.setAdapter(Fire);
}

public class UserViewHolder extends RecyclerView.ViewHolder{
    private TextView fName;
    public UserViewHolder(@NonNull View itemView) {
        super(itemView);
        fName = itemView.findViewById(R.id.SUTxt);

    }
}

}

我想从火力地堡实时数据库中搜索FNAME。搜索按钮按下我打电话firebaseUserSearch()方法。

我试过几个方法,但没有为我工作。我猜即时通讯做FirebaseRecycleViewAdapter错误。我提到this.where我该怎么错了?

编辑:

在这里我的数据库structureDatabase Stucture

更新后的代码:

public class SearchUserActivity extends AppCompatActivity {

private EditText SearchTxt;
private ImageButton SearchBtn;
private RecyclerView SearchRV;

private DatabaseReference mUserDatabase;

private FirebaseRecyclerAdapter<SearchGetterSetter,UserViewHolder> Fire;

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

    mUserDatabase = FirebaseDatabase.getInstance().getReference("users");
    SearchTxt = findViewById(R.id.SearchUserTxt);
    SearchBtn = findViewById(R.id.SearchUserBtn);
    SearchRV = findViewById(R.id.SearchUserRV);
   //        SearchRV.setHasFixedSize(true);
    SearchRV.setLayoutManager(new LinearLayoutManager(this));


    SearchBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String searchText = SearchTxt.getText().toString();
            firebaseUserSearch(searchText);
            Toast.makeText(SearchUserActivity.this, "Clicked", 
        Toast.LENGTH_SHORT).show();

        }
    });

}

private void firebaseUserSearch(String searchText) {

    Query firebaseSearchQuery = mUserDatabase.orderByChild("fname").startAt(searchText).endAt(searchText + "\uf8ff");

    FirebaseRecyclerOptions<SearchGetterSetter> response = new FirebaseRecyclerOptions.
            Builder<SearchGetterSetter>().setQuery(firebaseSearchQuery,SearchGetterSetter.class).build();

    Fire = new FirebaseRecyclerAdapter<SearchGetterSetter, UserViewHolder>(response){
        @NonNull
        @Override
        public UserViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
            View view = LayoutInflater.from(viewGroup.getContext())
                    .inflate(R.layout.search_user_item, viewGroup, false);
            return new UserViewHolder(view);
        }
        @Override
        protected void onBindViewHolder(@NonNull UserViewHolder holder, 
       int position, @NonNull SearchGetterSetter model) {
            holder.fname.setText(model.getFname());
        }

    };

    Fire.startListening();
    Fire.notifyDataSetChanged();
    SearchRV.setAdapter(Fire);

}

public static class UserViewHolder extends RecyclerView.ViewHolder{
    private TextView fname;
    public UserViewHolder(@NonNull View itemView) {
        super(itemView);
        fname = (TextView) itemView.findViewById(R.id.SUTxt);
    }
}


}
java android firebase firebase-realtime-database firebaseui
2个回答
2
投票

你的这种说法:

Query firebaseSearchQuery = mUserDatabase.child("fname");

应该

Query firebaseSearchQuery = mUserDatabase.orderByChild("fname").equals(searchText);

当我看到你的代码,你有没有在您的查询中使用SEARCHTEXT变量。


0
投票

要创建一个搜索功能,你需要创建一个查询看起来应该像这样的:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("users");
Query query = usersRef.orderByChild("fname").equalTo(searchedText);

所以每次你搜索一个名字,你应该返回一个新的查询对象。所以,你想在新的条件下筛选每一次,你将需要:

  1. 创建基于新的搜索文本的新查询: Query query = usersRef.orderByChild("name").equalTo(searchedText);
  2. 附加一个侦听这个新创建的查询。
  3. 这个新创建的查询的结果创建一个新的适配器,或使用notifydatasetchanged()方法更新现有的一个。
© www.soinside.com 2019 - 2024. All rights reserved.