所以我在这里得到了一段代码,该代码块从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);
}
如您所知,minPrice
和maxPrice
尚无任何作用,基本上,我想做些类似的事情:“如果对象价格高于minPrice且低于maxPrice,则将其放入RecyclerView ,否则,请返回并重复”。
顺便说一下,这就是应用当前的样子,这里的过滤器/排序有效:
我只停留在基于价格的过滤上,到目前为止,我已经尝试过将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循环。因此它确实发生了如下奇怪的事情:
由于某种原因,当我上下滚动时,这些“ TextView”对象消失了,而我的“降序/升序”不再起作用。
如果可能有帮助,这就是我进行下降/上升的方式,我只是反转/不反转布局:LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, true);
是的,有人知道如何执行此操作吗?如果有任何我应该提供的信息,请告诉我!
答案 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();
}