Невозможно реализовать RecycleAdapter для настраиваемого ArrayList для получения случайного результата запроса в базе данных

У меня есть база данных в Firestore и RecycleView, чтобы поместить данные из нее. Я отправляю запрос к Firestore, и он дает мне результат в зависимости от моего запроса. Но что, если я хочу взять 3 случайных результата из набора, выданного мне по запросу. То есть я получаю, например, 20 результатов и хочу получать только 3 результата каждый раз, когда отправляю запрос. И каждый раз должно быть случайным 3 результата из этих 20?

Мне помогли реализовать в коде механизм выделения 3-х случайных результатов, но я не понимаю, как его подключить к моему adapter.

    public class Myactivity extends AppCompatActivity {

    public RecyclerView mResultList;
    public FirebaseFirestore mFirestore;
    public com.google.firebase.firestore.Query query;
    public FirestoreRecyclerAdapter<Places, PlaceViewHolder> firestoreRecyclerAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycle_activity);
        mResultList = findViewById(R.id.list_result);

        Boolean l_check1 = getIntent().getExtras().getBoolean("1");
        Boolean l_check2 = getIntent().getExtras().getBoolean("2");
        Boolean l_check3 = getIntent().getExtras().getBoolean("3");
        mFirestore = FirebaseFirestore.getInstance();  
        if (l_check1) {
            query = mFirestore.collection("Places").whereEqualTo("colour", "1").limit(20);
            query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    List<Places> placesList = new ArrayList<>();
                    for (DocumentSnapshot document : task.getResult()) {
                        Places place = document.toObject(Places.class);
                        placesList.add(place);
                    }
                    int placeCount = placesList.size();
                    int randomNumber = new Random().nextInt(placeCount);

                    List<Places> randomPlaceList = new ArrayList<>();
                    for (int i=1; i<=3; i++) {
                        randomPlaceList.add(placesList.get(randomNumber));
                    }
                }
            }
        });
        } else if (l_check2) {
            query = mFirestore.collection("Places").whereEqualTo("colour", "2").limit(3);
        } else if (l_check3) {
            query = mFirestore.collection("Places").whereEqualTo("colour", "3").limit(3);
        }
        mResultList.setLayoutManager(new LinearLayoutManager(this));
        FirestoreRecyclerOptions<Places> options = new FirestoreRecyclerOptions.Builder<Places>()
                .setQuery(query, Places.class)
                .build();
        firestoreRecyclerAdapter = new FirestoreRecyclerAdapter<Places, PlaceViewHolder>(options) {
            @Override
            protected void onBindViewHolder(PlaceViewHolder holder, int position, Places model) {

                holder.setDetails(getApplicationContext(), model.getName(), model.getImage());
            }

            @Override
            public PlaceViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                View view = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.list_layout, parent, false);
                return new PlaceViewHolder(view);
            }

        };
        mResultList.setAdapter(firestoreRecyclerAdapter);
    }
    @Override
    protected void onStart() {
        super.onStart();
        firestoreRecyclerAdapter.startListening();
    }
    class PlaceViewHolder extends RecyclerView.ViewHolder {

        View mView;

        public PlaceViewHolder(View itemView) {
            super(itemView);

            mView = itemView;
        }

        public void setDetails(Context context, String placeName, String placeImage) {

            final TextView place_Name = mView.findViewById(R.id.text_image_id);
            ImageView place_Image = mView.findViewById(R.id.image_id);

            place_Name.setText(placeName);
            Glide.with(context).load(placeImage).into(place_Image);

            place_Name.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(getApplicationContext(), Card_activity.class);
                    intent.putExtra("qwerty", place_Name.getText());
                    startActivity(intent);
                }
            });
        }
    }
    @Override
    protected void onStop() {
        super.onStop();
        if (firestoreRecyclerAdapter != null) {
            firestoreRecyclerAdapter.stopListening();
        }
    }
}

My Place.class:

public class Places {
private String image, name;
public Places() { }

public Places(String image, String name) {
    this.image = image;
    this.name = name; 
}
public String getImage() { return image; }
public String getName() { return name; }   
}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
228
1

Ответы 1

Прежде всего, ваша логика для создания randomPlaceList неверна, поскольку вы просто генерируете одно случайное число с помощью new Random().nextInt(placeCount), а затем просто продолжаете использовать его трижды для добавления записей в свой список.

Вы должны обновить свою логику следующим образом:

...
final int placeCount = placesList.size();
final Random randomGenerator = new Random();
List<Places> randomPlaceList = new ArrayList<>();
for (int i = 0; i<=3; i++) {
    randomPlaceList.add(placesList.get(randomGenerator.nextInt(placeCount)));
}
...

См. Эту ветку, чтобы узнать, как можно заполнить RecyclerView после получения результатов из Firebase: Как заполнить адаптер RecyclerView с помощью Firebase

все работает хорошо, как и без ваших изменений, но у меня каждый раз получается 3 одинаковых результата ... @ user2004685

Spike Johnson 04.05.2018 21:23

И я снова забираю 20 результатов, а не 3 .. @ user2004685

Spike Johnson 04.05.2018 21:29

@SpikeJohnson Я не могу разобрать два вышеупомянутых комментария, которые вы оставили в моей голове. Не могли бы вы быть более ясными и конкретными? Я ответил на ваш вопрос!

user2004685 04.05.2018 21:37

Там я беру немного Extra из другого действия и на основе этого результата и проверяя его в цикле if, я делаю query в Firestore, затем из образца поиска я беру 3 результата, беру поля «имя» и «изображение» и устанавливаю их. в RecycleView. Но если условия одинаковы, то результат будет таким же, просто возьмите первые 3 поля из Firestore в порядке их размещения там, и, если они соответствуют условиям, они отображаются в RecycleView. Мне нужно, чтобы каждый раз это 3 результата было случайным. @ User2004685 Теперь, с этими изменениями, абсолютно ничего не меняется ..

Spike Johnson 04.05.2018 21:44

Некоторые люди сказали мне, что это происходит потому, что я использую для создания объекта options объект query, который не имеет ограничений. Чтобы решить эту проблему, мне нужно использовать в своем адаптере randomPlaceList, который содержит эти 3 случайных элемента, или ограничить это внутри адаптера, где я устанавливаю представления. @ User2004685

Spike Johnson 04.05.2018 21:45

Я имею в виду, как заставить адаптер работать не с классом модели, а с уже созданным ArrayList (randomPlaceList). Для работы не с 20 записями, которые я получил по запросу, а с 3 случайно выбранными и введенными в (randomPlaceList) @ user2004685

Spike Johnson 05.05.2018 10:16

Другие вопросы по теме