代码之家  ›  专栏  ›  技术社区  ›  Mārtiņš Ciekurs

如何在使用Firestore时为RecyclerView添加搜索过滤器?

  •  2
  • Mārtiņš Ciekurs  · 技术社区  · 8 年前

    所以,我试图创建一个显示作者列表(图片、姓名、简历)的应用程序,但问题是我在实现搜索功能时遇到了问题。使用指南 RecyclerView 我用的是 here .

    代码:MainActivity

    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 但我不确定,对android编程来说真的很陌生。:)

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

        @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 .

    1 回复  |  直到 8 年前
        1
  •  1
  •   Alex Mamo    8 年前

    为了搜索Writer,您需要创建 Query .

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

    查看您的 Klasiki 同学们,我要告诉你们,你们不尊重 Java Naming Conventions 所有字段的规则,反序列化时可能会出现问题。模型类应如下所示:

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

    请立即查看字段。所有开头都是小写字母。

    推荐文章