Я пытаюсь создать список карточек, которые будут генерироваться динамически, потому что на карточке есть кое-что, что мне нужно извлечь из 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>
вот как это сейчас отображается в приложении
Если я не включу макет карты в xml действия, приложение выйдет из строя, потому что не может найти объекты внутри карт для заполнения данными, но если я включу его, по-видимому, он создаст одну карту правильно заполненную, а все остальные одни просто заполнены предустановленными данными
Проблема, с которой вы столкнулись, связана с вашей функцией AddCard
. Вы увеличиваете card_view
, но вместо того, чтобы заглядывать внутрь нового card_view
(переменной card
) для заполнения представлений данными, вы смотрите в корневое представление (если вы просто вызовете findViewById
, оно будет искать внутри корня представление фрагмента/активности по умолчанию).
Чтобы исправить это:
<include layout = "@layout/sample_card_1" />
, так как она не нужна (ваш код должен динамически добавлять карты)AddCard
и измените эти три строки, как показано ниже: TextView nameWorker = card.findViewById(R.id.nameWorker);
RatingBar RatingBar = card.findViewById(R.id.ratingBar);
Button submitButton = card.findViewById(R.id.submitButton);
Изменив вызовы findViewById
так, чтобы они вместо этого вызывали представление card
, которое вы раздули, вы перестанете заглядывать внутрь корневого представления (которое решит те сбои, на которые вы ссылались), и вместо этого заполните новую карточку нужными вам деталями ( который решит проблему, с которой вы столкнулись при заполнении одной карты, а остальные значения по умолчанию).
спасибо большое наконец то работает! отмечен как решенный