Как получить случайные документы из Firestore и отобразить их в разных TextViews? - PullRequest
0 голосов
/ 06 января 2020

В моем приложении пользователь должен иметь возможность выбирать из 3 различных категорий (из 8), которые генерируются случайным образом. Для этого я использовал подход, описанный здесь .

Я не знаю, как использовать этот подход, чтобы использовать извлеченные документы для вставки их в TextViews в моей категории Activity. Я создал класс категории для хранения полученных документов из Firestore, но я также не знаю, является ли это даже правильным подходом. Я был бы очень признателен за каждый совет!

Вот моя категория деятельности, где 3 документа получаются и в конце должны отображаться в TextViews:

@Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.activity_category_selection, container, false);

        tvCategory1 = view.findViewById(R.id.text_view_category_1);
        tvCategory2 = view.findViewById(R.id.text_view_category_2);
        tvCategory3 = view.findViewById(R.id.text_view_category_3);
        textViewCategoryRound = view.findViewById(R.id.text_view_category_round);

        imageCategory1 = view.findViewById(R.id.image_category_1);
        imageCategory2 = view.findViewById(R.id.image_category_2);
        imageCategory3 = view.findViewById(R.id.image_category_3);

        categoryCollectionRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {

                    List<Category> categoryList = new ArrayList<>();
                    for (DocumentSnapshot document : task.getResult()) {
                        Category category = document.toObject(Category.class);
                        categoryList.add(category);
                    }

                    int categoryListSize = categoryList.size();
                    List<Category> randomCategoryList = new ArrayList<>();
                    for (int i = 0; i < categoryListSize; i++) {
                        Category randomCategory = categoryList.get(new Random().nextInt(categoryListSize));
                        if (!randomCategoryList.contains(randomCategory)) {
                            randomCategoryList.add(randomCategory);
                            if (randomCategoryList.size() == 3) {

                                break;

                            }
                        } else {
                            Log.d(TAG, "Error getting documents: ", task.getException());
                        }
                    }

                }
            }
        });

        return view;
    }
}

Вот класс категории где, я надеюсь, я правильно храню документы:

public class Category {

    public String category_name;


    public String picture_id;

    public Category (){

    }


    public String getPicture_id() {
        return picture_id;
    }

    public void setPicture_id(String picture_id) {
        this.picture_id = picture_id;
    }

    public String getCategory_name() {
        return category_name;
    }

    public void setCategory_name(String category_name) {
        this.category_name = category_name;
    }

    public Category(String category_name){
        this.category_name = category_name;
    }
}

Вот как я структурировал мою коллекцию категорий (есть 8 документов / категорий): enter image description here

Ответы [ 2 ]

1 голос
/ 06 января 2020

Привет, я могу предложить простой способ.

 List<Category> categoryList =null;

   categoryCollectionRef.get().addOnCompleteListener(new 
   OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {

               categoryList = new ArrayList<>();
                for (DocumentSnapshot document : task.getResult()) {
                    Category category = document.toObject(Category.class);
                    categoryList.add(category);
                }



                }

            }
        }
    });
testButtonClickListener....{
Collections.shuffle(categoryList);
    showShuffledList();
}
public void showShuffledList(){
textView1.setText(categoryList.get(0).getCategoryName())
 textView2.setText(categoryList.get(1).getCategoryName())
 textView3.setText(categoryList.get(2).getCategoryName())
}

Конечно, вы должны добавить нулевую проверку всех шагов и настроить больше способов.

0 голосов
/ 06 января 2020

Вы можете сделать 3 вещи:

1) при сохранении документов присвойте им имена с добавочным числом в конце, затем сгенерируйте 3 случайных числа в диапазоне и получите документы, заканчивающиеся этими числами.

2) добавьте во все документы поле, содержащее уникальный номер, и следуйте подходу, аналогичному описанному выше, но с использованием запроса к этим полям.

3) создайте специальное do c с именами всех других документов в массиве. Затем извлеките 3 do c имен из массива на основе сгенерированных случайных чисел.

Могут быть и другие способы, но это те подходы, которые сначала приходят мне в голову.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...