Не получается оптимизировать код при работе с Firebase и cardview. Большое количество cardview

  1. У меня в приложении будет около 300 cardView и каждая получает данные из коллекции с Firestore. Код, указанный ниже используется для получения данных из коллекции для одной cardView. Подскажите, что можно сделать чтобы не писать этот код 300 раз отдельно для каждой cardView?

    FirebaseFirestore db = FirebaseFirestore.getInstance();
     //dialog.show();
     db.collection("cardview1")
             .get().addOnCompleteListener(task -> {
                 if (task.isSuccessful()) {
                     for (QueryDocumentSnapshot document : Objects.requireNonNull(task.getResult())) {
                         String title = document.getString("title");
                         tvItem_title_vetA.setText(title);
                         String address = document.getString("address");
                         tvItem_address_vetA.setText(address);
                         String workingTime = document.getString("workingTime");
                         tvItem_workingTime_vetA.setText(workingTime);
                         String telNum = document.getString("telNum");
                         tvItem_telNum_vetA.setText(telNum);
                         Log.d("ololo", document.getId() + " => " + document.getData());
                     }
                 } else {
                     Log.w("ololo", "Error getting documents.", task.getException());
                 }
             });
    
  2. В каждой из 300 cardView у меня есть 3 кнопки. Можно ли также как-нибудь оптимизировать данные код, чтобы не писать его для всех 300 cardview? При этом в некоторых cardView может быть не 3 кнопки, а только 2 или 1 (зависит от наличия страницы в Инстаграм / почты / сайта). В проекте использую ScrollView. RecyclerView использовать не смог, т.к. были большие сложности с отработкой нажатия на кнопки (т.к. нажатие на определенную кнопку открывает определенную ссылку).

    btnItem1_instagram.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 Uri uri = Uri.parse("http://instagram.com/_u/test");
                 Intent i= new Intent(Intent.ACTION_VIEW,uri);
                 i.setPackage("com.instagram.android");
                 try {
                     startActivity(i);
                 } catch (ActivityNotFoundException e) {
                     startActivity(new Intent(Intent.ACTION_VIEW,
                             Uri.parse("http://instagram.com/test")));
                 }
             }
         });
    
         btnItem1_email.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 String[] emails = new String[]{"[email protected]"};
                 String mailSubject = "Письмо пользователя приложения APPNAME";
                 String mailBody = "Здравствуйте. Я хотел (-а) ... ";
                 Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
                 emailIntent.putExtra(Intent.EXTRA_EMAIL, emails);
                 emailIntent.putExtra(Intent.EXTRA_SUBJECT, mailSubject);
                 emailIntent.putExtra(Intent.EXTRA_TEXT, mailBody);
                 emailIntent.setData(Uri.parse("mailto:"));
                 if (emailIntent.resolveActivity(getPackageManager()) != null) {
                     startActivity(emailIntent);
                     Toast.makeText(getApplicationContext(), "Send email.", Toast.LENGTH_SHORT).show();
                 } else {
                     String err;
                     err = "У Вас отсутствуют установленные приложения с функцией отправки электронных писем";
                     Toast.makeText(getApplicationContext(), err, Toast.LENGTH_SHORT).show();
                 }
             }
             });
    
         btnItem1_www.setOnClickListener(v -> {
             Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://test.com/"));
             startActivity(browserIntent);
         });
    

Ответы (1 шт):

Автор решения: Виталий Перятин

Для решения этой задачи Вы можете использовать RecyclerView. Хорошая статья по использованию RecyclerView. С помощью свойств POJO моделей (объектов, в которых лежат только данные, без логики) для каждого Item Вы сможете настраивать как уникальную конфигурацию CardView, так и наполнение его данными.

→ Ссылка