我正在尝试根据对象的值过滤RecyclerView

时间:2018-10-12 23:30:45

标签: java android firebase android-recyclerview google-cloud-firestore

所以我在这里得到了一段代码,该代码块从Firebase / Firestore获取所有对象,并将它们设置在我的RecyclerView中:

public void getFromDatabase(String sortBy, String collectionPath, int minPrice, int maxPrice) {

    Query query = db.collection(collectionPath).orderBy(sortBy, Query.Direction.DESCENDING);

    FirestoreRecyclerOptions<Gpu> options = new FirestoreRecyclerOptions.Builder<Gpu>()
            .setQuery(query, Gpu.class)
            .build();

    adapter = new FirestoreRecyclerAdapter<Gpu, GpuHolder>(options) {

        @Override
        protected void onBindViewHolder(@NonNull GpuHolder holder, int position, @NonNull Gpu gpu) {

            holder.textViewModel.setText(gpu.getModel());
            holder.textViewPrice.setText(String.valueOf(gpu.getPrice()));
            holder.textViewBench.setText(String.valueOf(gpu.getBench()));
            holder.textViewValue.setText(String.valueOf(gpu.getValue()));
            holder.textViewType.setText(String.valueOf(gpu.getType()));
        }

        @NonNull
        @Override
        public GpuHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.gpulist_layout, parent, false);

            return new GpuHolder(view);
        }

    };

    adapter.notifyDataSetChanged();
    adapter.startListening();
    gpuRecycler.setAdapter(adapter);
}

如您所知,minPricemaxPrice尚无任何作用,基本上,我想做些类似的事情:“如果对象价格高于minPrice且低于maxPrice,则将其放入RecyclerView ,否则,请返回并重复”。

顺便说一下,这就是应用当前的样子,这里的过滤器/排序有效:

grafika

我只停留在基于价格的过滤上,到目前为止,我已经尝试过将if语句放入这样(minPrice设置为70,max设置为600):

        @Override
        protected void onBindViewHolder(@NonNull GpuHolder holder, int position, @NonNull Gpu gpu) {

            if (gpu.getPrice() > minPrice && gpu.getPrice() < maxPrice) {

                holder.textViewModel.setText(gpu.getModel());
                holder.textViewPrice.setText(String.valueOf(gpu.getPrice()));
                holder.textViewBench.setText(String.valueOf(gpu.getBench()));
                holder.textViewValue.setText(String.valueOf(gpu.getValue()));
                holder.textViewType.setText(String.valueOf(gpu.getType()));
            }
        }

但是我不能做else {continue;},因为这不是for循环。因此它确实发生了如下奇怪的事情:

enter image description here

由于某种原因,当我上下滚动时,这些“ TextView”对象消失了,而我的“降序/升序”不再起作用。

如果可能有帮助,这就是我进行下降/上升的方式,我只是反转/不反转布局:LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, true);

是的,有人知道如何执行此操作吗?如果有任何我应该提供的信息,请告诉我!

1 个答案:

答案 0 :(得分:0)

当选择不同的排序选项时,我会调用不同的方法并使用Collections.sort(options,new Comparator();

public void sortByPrice(){
Collections.sort(options, new Comparator<Gpu>() {
        public int compare(Gpu gpu1, Gpu gpu2) {
          // do your comparison of prices here 
    });

 adapter.notifyDatasetChanged();
}

在“ onClickListener()或其他事件监听器上,当他们选择所需的过滤器时,将在其中放置方法调用

这可以工作,但是对于实际的过滤器,您需要使用这样的方法

public void sortByPrice(){
ArrayList<Gpu> filteredList = new    ArrayList();
for(Gpu gpu : options){
     if(//whatever your requirements are){
   filteredList.add(gpu);
}
}

 adapter.setItems(filteredList);
 adapter.notifyDatasetChanged();
}