#java #android #android-studio #android-recyclerview #android-databinding
#java #Android #android-studio #android-recyclerview #android-привязка данных
Вопрос:
Раньше я не использовал привязку данных, и теперь я добавил ее в свой проект, но у меня проблема. Я не могу автоматически привязать свои данные. Во время открытия действия мои данные отображаются в текстовых местах и немедленно исчезают. Итак, я сделал что-то подобное для целей тестирования, когда я нажал на card views
in recyclerview
, я снова привязываю. На этот раз мои данные были перенесены в соответствующие места. В чем моя проблема? (Прошу прощения за мой плохой английский.)
Код адаптера;
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
FoodListBinding binding = DataBindingUtil.inflate(inflater,R.layout.food_list,parent,false);
return new ViewHolder(binding);
}
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
holder.binding.foodNameTextview.setText(_foodModelArrayList.get(position).getBesin_adi());
holder.binding.portionTextview.setText(_foodModelArrayList.get(position).getBesin_id());
holder.foodListCardview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.binding.foodNameTextview.setText(_foodModelArrayList.get(position).getBesin_adi());
holder.binding.portionTextview.setText(_foodModelArrayList.get(position).getBesin_id());
}
});
}
@Override
public int getItemCount() {
return _foodModelArrayList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
FoodListBinding binding;
private LottieAnimationView addFoodAnim;
private CardView foodListCardview;
public ViewHolder(@NonNull FoodListBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
}
Фрагмент кода;
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
Intent getDateFromActivity = getActivity().getIntent();
date = getDateFromActivity.getStringExtra("date");
loadingAnim = view.findViewById(R.id.loadingAnim);
recyclerView = view.findViewById(R.id.recyclerView);
enterFoodViewModel.getFood().observe(requireActivity(), new Observer<List<EnterFoodModel>>() {
@Override
public void onChanged(List<EnterFoodModel> enterFoodModels) {
if (enterFoodModels!=null){
loadingAnim.setVisibility(View.GONE);
}
foodList = enterFoodModels;
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
enterFoodRecyclerAdapter = new EnterFoodRecyclerAdapter(getContext(),foodList,date);
recyclerView.setAdapter(enterFoodRecyclerAdapter);
enterFoodRecyclerAdapter.notifyDataSetChanged();
}
});
}
xml-код;
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable
name="foods"
type="com.example.calorie.models.EnterFoodModel" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp">
<androidx.cardview.widget.CardView
android:id="@ id/foodListCardview"
android:layout_width="match_parent"
android:layout_height="80dp"
android:layout_marginStart="8dp"
android:layout_marginEnd="8dp"
android:layout_marginBottom="2dp"
android:clickable="true"
android:elevation="10dp"
android:focusable="true"
android:foreground="?android:attr/selectableItemBackground"
app:cardCornerRadius="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@ id/foodNameTextview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="16dp"
android:gravity="center"
android:text="@{foods.besin_adi}"
android:textColor="@android:color/black"
android:textSize="18sp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@ id/portionTextview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:gravity="center"
android:textColor="@color/colorAccent"
android:text="@{foods.besin_id}"
android:textSize="15sp"
app:layout_constraintStart_toStartOf="@ id/foodNameTextview"
app:layout_constraintTop_toBottomOf="@ id/foodNameTextview" />
<com.airbnb.lottie.LottieAnimationView
android:id="@ id/addFoodAnim"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginEnd="16dp"
android:visibility="gone"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:lottie_autoPlay="true"
app:lottie_loop="true"
app:lottie_rawRes="@raw/loading" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.cardview.widget.CardView>
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
Problem images;
When the applications is fragment: https://hizliresim.com/7HA2E8
After clicking on cardviews: https://hizliresim.com/qu8yIO
Комментарии:
1. Для чего именно нужен этот XML-файл? Кроме того, я действительно не понимаю, где вы назначаете его внутреннюю переменную
foods
, которая могла бы объяснить, почему она не работает в первую очередь.2. Этот XML-файл интегрирован в recyclerview. Присвоение переменной было назначено двум textviews. Я до сих пор не понимаю, почему это не работает.
3. Я имею в виду, что вы делаете
binding.foods = enterFoodsModels
, чтобы соединить вашdata class
с макетом XML4. Спасибо. Я решил это благодаря вашей помощи. Исправлено.
5. публикую свой комментарий в качестве ответа. Пожалуйста, не стесняйтесь соглашаться, если это действительно решило вашу проблему!
Ответ №1:
Попробуйте binding.foods = enterFoodsModels
подключить свой класс данных к макету XML.
Ответ №2:
Я обновил свои коды таким образом, и ошибка была исправлена.
@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
EnterFoodModel enterFoodModel = _foodModelArrayList.get(position);
holder.bind(enterFoodModel);
}
public class ViewHolder extends RecyclerView.ViewHolder {
FoodListBinding binding;
public ViewHolder(FoodListBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
public void bind(EnterFoodModel enterFoodModel){
binding.setFoods(enterFoodModel);
binding.executePendingBindings();
}
}