Cardview отображается дважды при динамической генерации

Я пытаюсь создать список карточек, которые будут генерироваться динамически, потому что на карточке есть кое-что, что мне нужно извлечь из FireStore. Я сделал это в значительной степени, но карта появляется дважды, фактическая карта отображается нормально, но затем есть макет карты сзади с предустановленными текстами и прочим.

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

вот код, который я использую для создания карты (обновлен с полной активностью)

public class ScrollingActivity extends AppCompatActivity {

FirebaseFirestore db = FirebaseFirestore.getInstance();
FirebaseAuth fAuth = FirebaseAuth.getInstance();
LinearLayout layout;
String name;

float rating;

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_scrolling);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    CollapsingToolbarLayout toolBarLayout = findViewById(R.id.toolbar_layout);
    toolBarLayout.setTitle(getTitle());

    for (int i = 0; i<6; i++){
        addCard(i);
    }

    FloatingActionButton fab = findViewById(R.id.fab);
    fab.setOnClickListener(view -> Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
            .setAction("Action", null).show());

}

private void addCard(int workerNum) {
    layout = findViewById(R.id.thisone);
    View card = getLayoutInflater().inflate(R.layout.sample_card_1, layout, false);

    TextView nameWorker = findViewById(R.id.nameWorker);
    RatingBar RatingBar = findViewById(R.id.ratingBar);
    Button submitButton = findViewById(R.id.submitButton);

    DocumentReference docRef = db.collection("workers").document(String.valueOf(workerNum));
    docRef.get().addOnCompleteListener(task -> {
        if (task.isSuccessful()) {
            DocumentSnapshot document = task.getResult();
            if (document.exists()) {
                Log.d(TAG, "DocumentSnapshot data: " + document.getData());
                name = document.toObject(Classes.Worker.class).getName();
                nameWorker.setText(name);
                rating = document.toObject(Classes.Worker.class).getRating();
                RatingBar.setRating(rating);
            } else {
                Log.d(TAG, "No such document");
            }
        } else {
            Log.d(TAG, "get failed with ", task.getException());
        }
    });

    // perform click event on button
    submitButton.setOnClickListener(v -> {
        DocumentReference changerating = db.collection("workers").document(String.valueOf(workerNum));
        changerating.update("rating", RatingBar.getRating()).addOnSuccessListener(aVoid ->
                Log.d(TAG, "DocumentSnapshot successfully updated!"))
                .addOnFailureListener(e -> Log.w(TAG, "Error updating document", e));
        // get values and then displayed in a toast
        String rating1 = "On a scale of 5 Stars\n New rating = " + RatingBar.getRating();
        Toast.makeText(getApplicationContext(), rating1, Toast.LENGTH_LONG).show();
    });

    layout.addView(card);
}

Вот xml макета, где на самом деле показаны карты

<?xml version = "1.0" encoding = "utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 
xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
xmlns:tools = "http://schemas.android.com/tools"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:fitsSystemWindows = "true"
tools:context = ".ScrollingActivity">

<com.google.android.material.appbar.AppBarLayout
    android:id = "@+id/app_bar"
    android:layout_width = "match_parent"
    android:layout_height = "@dimen/app_bar_height"
    android:fitsSystemWindows = "true"
    android:theme = "@style/Theme.InternshipThesis.AppBarOverlay">

    <com.google.android.material.appbar.CollapsingToolbarLayout
        android:id = "@+id/toolbar_layout"
        android:layout_width = "match_parent"
        android:layout_height = "match_parent"
        android:fitsSystemWindows = "true"
        app:contentScrim = "?attr/colorPrimary"
        app:layout_scrollFlags = "scroll|exitUntilCollapsed"
        app:toolbarId = "@+id/toolbar">

        <androidx.appcompat.widget.Toolbar
            android:id = "@+id/toolbar"
            android:layout_width = "match_parent"
            android:layout_height = "?attr/actionBarSize"
            app:layout_collapseMode = "pin"
            app:popupTheme = "@style/Theme.InternshipThesis.PopupOverlay" />

    </com.google.android.material.appbar.CollapsingToolbarLayout>
</com.google.android.material.appbar.AppBarLayout>

<androidx.core.widget.NestedScrollView
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    app:layout_behavior = "@string/appbar_scrolling_view_behavior"
    tools:context = ".ScrollingActivity"
    tools:showIn = "@layout/activity_scrolling">


    <LinearLayout
        android:id = "@+id/thisone"
        android:layout_width = "match_parent"
        android:layout_height = "wrap_content"
        android:orientation = "vertical"
        android:padding = "20dp">

        <include layout = "@layout/sample_card_1" />
    </LinearLayout>

</androidx.core.widget.NestedScrollView>

<com.google.android.material.floatingactionbutton.FloatingActionButton
    android:id = "@+id/fab"
    android:layout_width = "wrap_content"
    android:layout_height = "wrap_content"
    android:layout_margin = "@dimen/fab_margin"
    app:layout_anchor = "@id/app_bar"
    app:layout_anchorGravity = "bottom|end"
    app:srcCompat = "@android:drawable/ic_menu_sort_by_size"
    android:contentDescription = "@string/main_fab_desc" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

Вот макет карты

<?xml version = "1.0" encoding = "utf-8"?>
<androidx.cardview.widget.CardView
xmlns:android = "http://schemas.android.com/apk/res/android"
xmlns:app = "http://schemas.android.com/apk/res-auto"
android:id = "@+id/card"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
app:cardCornerRadius = "20dp"
app:cardElevation = "2dp"
android:layout_marginStart = "16dp"
android:layout_marginTop = "16dp"
android:layout_marginEnd = "16dp">

<androidx.constraintlayout.widget.ConstraintLayout
    android:id = "@+id/linearLayout"
    android:layout_width = "match_parent"
    android:layout_height = "match_parent"
    android:orientation = "vertical"
    android:padding = "15dp">

    <com.google.android.material.imageview.ShapeableImageView
        android:id = "@+id/imageView"
        android:layout_width = "100dp"
        android:layout_height = "100dp"
        app:shapeAppearanceOverlay = "@style/roundedImageView"
        android:contentDescription = "@string/Desc_Photo_Card1"
        app:layout_constraintStart_toStartOf = "parent"
        app:layout_constraintTop_toTopOf = "parent"
        app:srcCompat = "@drawable/sample_worker_1" />

    <TextView
        android:id = "@+id/nameWorker"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        android:text = "@string/Text1_Card1"
        android:textSize = "20sp"
        app:layout_constraintStart_toEndOf = "@+id/imageView"
        app:layout_constraintTop_toTopOf = "@+id/imageView"
        android:padding = "10dp"/>

    <RatingBar
        android:id = "@+id/ratingBar"
        android:layout_width = "wrap_content"
        android:layout_height = "wrap_content"
        app:layout_constraintBottom_toBottomOf = "@+id/imageView"
        app:layout_constraintStart_toEndOf = "@+id/imageView"
        app:layout_constraintTop_toBottomOf = "@+id/nameWorker" />

    <com.google.android.material.button.MaterialButton
        android:id = "@+id/submitButton"
        android:layout_width = "150dp"
        android:layout_height = "wrap_content"
        android:layout_centerInParent = "true"
        android:padding = "10dp"
        android:text = "@string/rating_button"
        android:textColor = "#fff"
        android:textSize = "20sp"
        android:textStyle = "bold"
        app:cornerRadius = "20dp"
        app:layout_constraintEnd_toEndOf = "@+id/ratingBar"
        app:layout_constraintHorizontal_bias = "0.0"
        app:layout_constraintStart_toStartOf = "@+id/ratingBar"
        app:layout_constraintTop_toBottomOf = "@+id/ratingBar" />

</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>

вот как это сейчас отображается в приложении

пример 1

Если я не включу макет карты в xml действия, приложение выйдет из строя, потому что не может найти объекты внутри карт для заполнения данными, но если я включу его, по-видимому, он создаст одну карту правильно заполненную, а все остальные одни просто заполнены предустановленными данными

0
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема, с которой вы столкнулись, связана с вашей функцией AddCard. Вы увеличиваете card_view, но вместо того, чтобы заглядывать внутрь нового card_view (переменной card) для заполнения представлений данными, вы смотрите в корневое представление (если вы просто вызовете findViewById, оно будет искать внутри корня представление фрагмента/активности по умолчанию).

Чтобы исправить это:

  1. Удалите эту строку из основного вида: <include layout = "@layout/sample_card_1" />, так как она не нужна (ваш код должен динамически добавлять карты)
  2. Измените свою функцию AddCard и измените эти три строки, как показано ниже:
    TextView nameWorker = card.findViewById(R.id.nameWorker);
    RatingBar RatingBar = card.findViewById(R.id.ratingBar);
    Button submitButton = card.findViewById(R.id.submitButton);

Изменив вызовы findViewById так, чтобы они вместо этого вызывали представление card, которое вы раздули, вы перестанете заглядывать внутрь корневого представления (которое решит те сбои, на которые вы ссылались), и вместо этого заполните новую карточку нужными вам деталями ( который решит проблему, с которой вы столкнулись при заполнении одной карты, а остальные значения по умолчанию).

спасибо большое наконец то работает! отмечен как решенный

Wingo 18.03.2022 14:35

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