Я пытаюсь отфильтровать RecyclerView на основе значения объекта - PullRequest
0 голосов
/ 13 октября 2018

поэтому я получил здесь блок кода, который получает все мои объекты из 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, в противном случае, вернитесь и повторите".

Кстати, этоКак приложение в данный момент выглядит, здесь работают фильтры / сортировка:

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 голосов
/ 13 октября 2018

Я хотел бы, чтобы при выборе разных вариантов сортировки они вызывали разные методы и использовали 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...