Comment avoir une ListView/RecyclerView l'intérieur d'un parent RecyclerView?
Je tiens à ajouter quelques Vues enfant (les Éléments de la Liste), qui viennent à moi à partir des données au format JSON. Chaque enfant de la liste est en vertu d'un parent de l'élément de liste ligne. Comment puis-je remplir dans RecyclerView
pour chaque ligne de l'élément (les éléments Parents à l'enfant les éléments de la liste)?
J'ai essayé d'utiliser RecyclerView
dans RecyclerView
ligne parent (pour l'alimentation de l'enfant de listes), mais ici les vues enfant ne sont pas visibles.
Parent Adaptateur Classe
public class DigitizedPrescAdapter extends RecyclerView.Adapter<DigitizedPrescAdapter.ListItemViewHolder>{
private List<PrescriptionModal> prescriptionList;
MedicinesInPrescAdapter adapter;
public DigitizedPrescAdapter(List<PrescriptionModal> prescriptionListModal) {
if (prescriptionListModal == null) {
throw new IllegalArgumentException(
"PrescriptionList must not be null");
}
this.prescriptionList = prescriptionListModal;
}
@Override
public ListItemViewHolder onCreateViewHolder(
ViewGroup viewGroup, int viewType) {
View itemView = LayoutInflater.
from(viewGroup.getContext()).
inflate(R.layout.item_row_digitised_request,
viewGroup,
false);
return new ListItemViewHolder(itemView);
}
@Override
public void onBindViewHolder(
ListItemViewHolder viewHolder, int position) {
PrescriptionModal model = prescriptionList.get(position);
viewHolder.prescnum.setText("Prescription "+ ++position);
viewHolder.prescNo.setText("Prescription: "+model.getPrescriptionID());
viewHolder.doctorType.setText("Type: "+model.getDoctorType());
viewHolder.doctorName.setText("Doctor: "+model.getDoctorName());
viewHolder.patientName.setText("Patient: "+model.getPatientName());
adapter = new MedicinesInPrescAdapter(model.getLstproduct());
viewHolder.lstMedicines.setAdapter(adapter);
}
@Override
public int getItemCount() {
return prescriptionList.size();
}
public final static class ListItemViewHolder
extends RecyclerView.ViewHolder {
TextView prescnum;
TextView prescNo;
TextView doctorType;
TextView patientName;
TextView doctorName;
CheckBox selectAll;
RecyclerView lstMedicines;
public ListItemViewHolder(View itemView) {
super(itemView);
prescnum = (TextView) itemView.findViewById(R.id.prescnum);
prescNo = (TextView) itemView.findViewById(R.id.prescNo);
doctorType = (TextView) itemView.findViewById(R.id.doctorType);
patientName = (TextView) itemView.findViewById(R.id.patientName);
doctorName = (TextView) itemView.findViewById(R.id.doctorName);
selectAll = (CheckBox) itemView.findViewById(R.id.selectAll);
lstMedicines = (RecyclerView) itemView.findViewById(R.id.lstAllMedicines);
MyLinearLayoutManager layoutManager = new MyLinearLayoutManager(itemView.getContext(),LinearLayoutManager.VERTICAL,false);
lstMedicines.setHasFixedSize(false);
lstMedicines.setLayoutManager(layoutManager);
}
}
}
Enfant Adaptateur Classe
public class MedicinesInPrescAdapter extends RecyclerView.Adapter<MedicinesInPrescAdapter.MedicineListItemViewHolder>{
List<Modal_Product_List> prescriptionProducts;
public MedicinesInPrescAdapter(List<Modal_Product_List> prescriptionListProd) {
if (prescriptionListProd == null) {
throw new IllegalArgumentException(
"PrescriptionProductList must not be null");
}
this.prescriptionProducts = prescriptionListProd;
}
@Override
public MedicineListItemViewHolder onCreateViewHolder(
ViewGroup viewGroup, int viewType) {
View itemView = LayoutInflater.
from(viewGroup.getContext()).
inflate(R.layout.item_row_medicine_productlist,
viewGroup,
false);
return new MedicineListItemViewHolder(itemView);
}
@Override
public void onBindViewHolder(
MedicineListItemViewHolder viewHolder, int position) {
Modal_Product_List modelMedicine = prescriptionProducts.get(position);
viewHolder.medicineName.setText(modelMedicine.getMedicinename());
viewHolder.medQty.setText(modelMedicine.getQuantity());
viewHolder.days.setText("30");
viewHolder.Amount.setText(modelMedicine.getQuantitybasedprice());
}
@Override
public int getItemCount() {
return prescriptionProducts.size();
}
public final static class MedicineListItemViewHolder
extends RecyclerView.ViewHolder {
TextView medicineName;
EditText medQty;
TextView days;
TextView Amount;
CheckBox selectMe;
public MedicineListItemViewHolder(View itemView) {
super(itemView);
medicineName = (TextView) itemView.findViewById(R.id.medicineName);
medQty = (EditText) itemView.findViewById(R.id.medQty);
days = (TextView) itemView.findViewById(R.id.days);
Amount = (TextView) itemView.findViewById(R.id.amount);
selectMe = (CheckBox) itemView.findViewById(R.id.selectMe);
}
}
}
- Essayez de Expandablelistview, mettre les parents de l'en-tête et l'enfant, de son point de vue.
Vous devez vous connecter pour publier un commentaire.
J'ai eu ce problème il ya quelques jours et enfin résolu. Tout ce que vous avez à faire est de @override le layout manager onMeasure fonction comme ci-dessous:
CustomLinearLayoutManager
Vous pouvez simplement copier et coller le gestionnaire de mise en page personnalisée comme ci-dessus et dans l'ensemble de votre recyclerview dans le parent de l'adaptateur comme ceci:
Rappelez-vous : Ne pas utiliser la même layoutManager en tant que parent de l'adaptateur, ou une erreur se produira.
Si je comprends bien, vous voulez un RecyclerView avec RecyclerView lignes.
Dans ce cas, je vous recommande d'utiliser un extensible RecyclerView, à l'aide de cette lib. Il suffit de suivre les extensible exemple dans le lien.
Il ya beaucoup plus de fonctionnalités sympas dans la même lib, comme le Glisser-Déposer, Swipeable lignes... Regarder ce en moins d'une minute vidéo par exemple.
Vous avez juste à ajouter la lib pour les dépendances dans votre
gradle.build
fichier, comme suit:Pour être en mesure de
import
la lib dans vos fichiers java.compile 'com.android.support:recyclerview-v7:23.0.0'
,compile 'com.android.support:cardview-v7:23.0.0'
etcompile 'com.android.support:appcompat-v7:23.0.0'
dois-je changer cela?Par Android Support Library 23.2 d'une bibliothèque de prise en charge de la version 23.2.0. Donc, tous les
WRAP_CONTENT
devrait fonctionner correctement.Veuillez mettre à jour la version de bibliothèque dans gradle fichier.
Cela permet une
RecyclerView
à la taille elle-même basée sur la taille de son contenu. Cela signifie que précédemment indisponible scénarios, comme l'utilisation deWRAP_CONTENT
pour une dimension de laRecyclerView
, sont désormais possibles. Vous trouverez tous les construit dans LayoutManagers désormais en charge de l'auto-mesure.vous devrez appeler
setAutoMeasureEnabled(true)
Comme
setAutoMeasureEnabled
est obsolète, une solution alternativeCette méthode est dépréciée de l'API de niveau 27.1.0. Des réalisateurs de
LayoutManager
doit définir si oui ou non il utilise AutoMeasure en substituantisAutoMeasureEnabled()
.RecyclerView.LayoutManager layout = new LinearLayoutManager(context); layout.setAutoMeasureEnabled(true);
Veuillez noter: vous ne devez pas créer de nouvelle Carte à chaque fois lorsque les appels onBindView(), vous devriez le faire une fois dans la onCreateView().
Le Meilleur Moyen à utiliser n'importe quelle bibliothèque, par exemple - RendererRecyclerViewAdapter
Comment ajouter un NestedRecyclerView:
Étape 1: Ajouter le
ViewModel
interface de votreModal_Product_List
Étape 2: Créer un
ViewBinder
pour laModal_Product_List
:Étape 3: Ajouter le
CompositeViewModel
interfacePrescriptionModal
de prolonger ou deDefaultCompositeModel
:Étape 4: Créer un
ViewBinder
pour laPrescriptionModal
:L'étape 5(Facultatif): Si vous avez besoin d'un Custom
LayoutManager
, puis étendre laCompositeViewBinder
et remplacer lecreateLayoutManager
de la méthode et de l'utiliser à la place deCompositeViewBinder
Étape 6: Initialiser
RendererRecyclerViewAdapter
et enregistrer moteur de rendu:C'est vraiment court et moyen simple d'ajouter un Imbriquée RecyclerView