studio recyclerview library expandablerecyclerviewadapter android android-custom-view android-recyclerview android-databinding

android - library - RecyclerView y Data Binding no funcionan



expandablerecyclerviewadapter (1)

En su onCreateViewHolder :

@Override public BadgeBindingHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); ProfileBadgeRowBinding binding = DataBindingUtil.inflate(inflater, R.layout.profile_badge_row, parent, false); BadgeBindingHolder holder = new BadgeBindingHolder(binding.getRoot(), binding); return holder; }

Y añada el enlace en su vista de artículo.

public class BadgeBindingHolder extends RecyclerView.ViewHolder{ private ProfileBadgeRowBinding binding; public BadgeBindingHolder(View rowView, ProfileBadgeRowBinding binding) { super(rowView); this.binding = binding; } ... }

Y en el bindToViewHolder establece la variable

@Override public void bindToViewHolder(RecyclerView.ViewHolder viewHolder) { ProfileBadgeRowBinding binding = ((BadgeBindingHolder) viewHolder).binding; binding.setVariable(BR.badge, badge); binding.executePendingBindings(); // This line is important, it will force to load the variable in a custom view }

Si desea acceder a una vista, agregue una identificación a una vista en su xml .

<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <variable name="badge" type="parseJsonEntities.requestObjects.BadgeObject"/> </data> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </layout>

Y luego puedes acceder a los ID en tu bindToViewHolder

@Override public void bindToViewHolder(RecyclerView.ViewHolder viewHolder) { ProfileBadgeRowBinding binding = ((BadgeBindingHolder) viewHolder).binding; binding.setVariable(BR.badge, badge); binding.executePendingBindings(); binding.image.setImage(...); }

Más información sobre vistas personalizadas https://developer.android.com/topic/libraries/data-binding/index.html#dynamic_variables

Este es mi primer intento de vincular datos con RecyclerView, pero no mi primer uso de RecyclerView.

Por alguna razón, ninguno de los métodos de adaptador se llama, ni siquiera getItemCount (). Podría ser un problema estúpido con mi RecyclerView y nada que ver con el enlace de datos en absoluto, pero no puedo ver nada malo.

View rootview = inflater.inflate(R.layout.fragment_profile_first, container, false); // Initialize recycler view RecyclerView badgesRV = (RecyclerView) rootview.findViewById(R.id.badgesRV); LinearLayoutManager llm = new LinearLayoutManager(getActivity()); llm.setOrientation(LinearLayoutManager.HORIZONTAL); badgesRV.setLayoutManager(llm); BadgeAdapter badgeAdapter = new BadgeAdapter(profileObject.badgesEntity.badges); badgesRV.setAdapter(badgeAdapter);

Adaptador:

public class BadgeAdapter extends RecyclerView.Adapter<BadgeAdapter.BadgeBindingHolder>{ private static final int MAX_BADGES_TO_DISPLAY = 5; private BadgeObject[] badges; public BadgeAdapter(BadgeObject[] badges){ this.badges = badges; } @Override public BadgeBindingHolder onCreateViewHolder(ViewGroup parent, int viewType) { View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.profile_badge_row, parent, false); BadgeBindingHolder holder = new BadgeBindingHolder(v); return holder; } @Override public void onBindViewHolder(BadgeBindingHolder holder, int position) { final BadgeObject badgeObject = badges[position]; holder.getBinding().setVariable(BR.badge, badgeObject); holder.getBinding().executePendingBindings(); } @Override public int getItemCount() { Log.d(TAG, "item count = " + Math.min(MAX_BADGES_TO_DISPLAY, badges.length)); return Math.min(MAX_BADGES_TO_DISPLAY, badges.length); } public class BadgeBindingHolder extends RecyclerView.ViewHolder{ private ViewDataBinding binding; public BadgeBindingHolder(View rowView) { super(rowView); binding = DataBindingUtil.bind(rowView); } public ViewDataBinding getBinding() { return binding; } } }

profile_badge_row.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <data> <variable name="badge" type="parseJsonEntities.requestObjects.BadgeObject"/> </data> <LinearLayout android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@{badge.badgeImage}"/> </LinearLayout>

He comprobado y definitivamente hay datos allí. ¿Qué me he perdido?

=====================

Actualizar:

Por lo que puedo decir, RecyclerView simplemente no funciona dentro de un diseño de enlace de datos. Creé un diseño separado solo con mi RV y funcionó perfectamente. Tan pronto como lo incluí en mi diseño principal, dejó de funcionar.

No estoy seguro si esto es un error o una característica.

Entonces, pensé que tal vez si lo hago una vista personalizada tal vez funcione y lo haga. Mi problema es que no sé cómo pasar un valor a mi vista personalizada.

Miré here pero no pude entender exactamente lo que quiere decir. Este es mi código en la vista personalizada.

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.profile_badges_layout, this, true); ProfileBadgesLayoutBinding binding = ProfileBadgesLayoutBinding.inflate(inflater); RecyclerView badgesRV = (RecyclerView) view.findViewById(R.id.badgesRV); LinearLayoutManager llm = new LinearLayoutManager(context); llm.setOrientation(LinearLayoutManager.HORIZONTAL); badgesRV.setLayoutManager(llm); BadgeAdapter badgeAdapter = new BadgeAdapter(null); badgesRV.setAdapter(badgeAdapter);

Esto da un mensaje de que ProfileBadgesLayoutBinding no se encuentra.