如何在使用 Firestore 时为 RecyclerView 添加搜索筛选器



所以,我正在尝试创建显示作家列表(图像,姓名,生物(的应用程序,问题是我在实现搜索功能时遇到问题。使用我使用的RecyclerView的指南在这里。

代码:主活动

public class MainActivity extends AppCompatActivity {
private FirebaseFirestore db;
private FirestoreRecyclerAdapter adapter;
private LinearLayoutManager linearLayoutManager;//nodrosina kada veida recycle attelos
private List<Klasiki> list;
@BindView(R.id.imageRecycleView)
RecyclerView klasikiList;  //tas pats kas find by ID
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ButterKnife.bind(this);
    linearLayoutManager = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false);
    klasikiList.setLayoutManager(linearLayoutManager);
    db = FirebaseFirestore.getInstance();
    getList();

}
            //atgriez ierakstus no datubazes un nodrosina atteloshanu recycle view
private void getList(){
    Query query = db.collection("klasiki");
    FirestoreRecyclerOptions<Klasiki> response = new FirestoreRecyclerOptions.Builder<Klasiki>()
            .setQuery(query, Klasiki.class)
            .build();
    adapter = new FirestoreRecyclerAdapter<Klasiki, klasikiHolder>(response) {
        @Override
        protected void onBindViewHolder(final klasikiHolder holder, int position, final Klasiki model) {
            holder.name.setText(model.getName());
            holder.shortBio.setText(model.getShortBio());
            Glide.with(getApplicationContext()).load(model.getImage()).into(holder.image);

            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent = new Intent(MainActivity.this, BioActivity.class);
                            //Parnes mainigos uz bio activity
                    Bundle extras = new Bundle();
                    extras.putString("imageInfo", model.getImage());
                    extras.putString("nameInfo", model.getName());
                    extras.putString("bioInfo", model.getFullBio());
                    intent.putExtras(extras);
                    startActivity(intent);
                }
            });
        }
        @Override
        public klasikiHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.klasiki_layout, parent, false);
            return new klasikiHolder(view);
        }                       //nodrosina jauna ieraksta returnu
        @Override
        public void onError(FirebaseFirestoreException e) {
            Log.e("error", e.getMessage());
        }
    };
    adapter.notifyDataSetChanged();
    klasikiList.setAdapter(adapter);
}
        //izsauc mainigos
public class klasikiHolder extends RecyclerView.ViewHolder{
    @BindView(R.id.name)
    TextView name;
    @BindView(R.id.klasikiImage)
    ImageView image;
    @BindView(R.id.shortBio)
    TextView shortBio;

    public klasikiHolder(View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);
    }
}
@Override
protected void onStart() {
    super.onStart();
    adapter.startListening();
}
@Override
protected void onStop() {
    super.onStop();
    adapter.stopListening();
}

构造 函数

public class Klasiki {
private String Name;
private String Image;
private String shortBio;
private String fullBio;
public Klasiki(){}
public Klasiki(String name, String image, String shortBio, String fullBio) {
    Name = name;
    Image = image;
    this.shortBio = shortBio;
    this.fullBio = fullBio;
}
public String getName() {
    return Name;
}
public void setName(String name) {
    Name = name;
}
public String getImage() {
    return Image;
}
public void setImage(String image) {
    Image = image;
}
public String getShortBio() {
    return shortBio;
}
public void setShortBio(String shortBio) {
    this.shortBio = shortBio;
}
public String getFullBio() {
    return fullBio;
}
public void setFullBio(String fullBio) {
    this.fullBio = fullBio;
}

}

我想我必须使用除FirestoreRecyclerOptions以外的其他RecyclerView,但我不确定,对安卓编程真的很陌生。 :)

更新:所以我做了这样的东西:

    @Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.search_menu, menu);
    // Retrieve the SearchView and plug it into SearchManager
    final SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.action_search));
    SearchManager searchManager = (SearchManager) getSystemService(SEARCH_SERVICE);
    searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String text) {
            querySearch = db.collection("klasiki").whereEqualTo("name", text);
            if (!text.trim().isEmpty()){
                getList(querySearch);
                adapter.startListening();
            }
            return false;
        }
        @Override
        public boolean onQueryTextChange(String newText) {
            if (newText.trim().isEmpty()){
                getList(queryFinal);
                adapter.startListening();
            }
            return false;
        }
    });
    return true;
}

可能不是最好的解决方案,但现在我有不同的问题。有没有办法对Firestore进行子字符串搜索?像db.collection("klasiki").whereEqualTo("name", Ja);一样,它显示了以Ja开头的名称。

为了搜索写入器,您需要创建一个Query

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
Query nameOfTheWritterQuery = rootRef.collection("writters")
    .whereEqualTo("writterName", "Eidemanis Roberts");

看到您的Klasiki类,我需要告诉您,您不尊重所有字段的 Java 命名约定规则,并且在反序列化时可能会遇到问题。模型类应如下所示:

public class Klasiki {
    private String name, image, shortBio, fullBio;
    public Klasiki( ){}
    public Klasiki(String name, String image, String shortBio, String fullBio) {
        this.name = name;
        this.image = image;
        this.shortBio = shortBio;
        this.fullBio = fullBio;
    }
    public String getName() {return name;}
    public void setName(String name) {this.name = name;}
    public String getImage() {return image;}
    public void setImage(String image) {this.image = image;}
    public String getShortBio() {return shortBio;}
    public void setShortBio(String shortBio) {this.shortBio = shortBio;}
    public String getFullBio() {return fullBio;}
    public void setFullBio(String fullBio) {this.fullBio = fullBio;}
}

请立即查看字段。所有开始都将小写字母。

最新更新