Comment ajouter un recyclerView l'intérieur d'un autre recyclerView
J'ai l'intention de développer une application qui montre une certaine dynamique de données à l'intérieur d'un recyclerCardView
. J'ai donc décidé d'ajouter un recyclerView
appelé CheckBoxRecyclerView
à l'intérieur de mon principal recyclerView
. C'est mon code de mon application :
Mon Activité Principale :
setContentView(R.layout.activity_startup);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
reminderView = (RecyclerView) findViewById(R.id.reminder_recycler_view);
RlayoutManager = new LinearLayoutManager(this);
reminderView.setLayoutManager(RlayoutManager);
setSupportActionBar(toolbar);
cardView = (CardView) findViewById(R.id.card_first);
cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext() , ReminderActivity.class);
startActivity(intent);
}
});
ReminderHelper helper = new ReminderHelper(getApplicationContext());
ReminderAdapter reminderAdapter = new ReminderAdapter(helper);
ContentValues reminderValues = new ContentValues();
ContentValues checkboxValues = new ContentValues();
//Devlopment Part ->
reminderValues.put("reminderTitle" , "A Reminder Title");
reminderValues.put("reminderLastModDate" , 0);
reminderValues.put("reminderAlarm" , 0);
reminderValues.put("reminderPicURI" , "skjshksjh");
reminderValues.put("ReminderBackground" , "#00796b");
checkboxValues.put("checkboxText" , "This is a CheckBox");
checkboxValues.put("isDone" , false);
checkboxValues.put("checkboxReminderID" , 0);
reminderAdapter.INSERT_REMINDER(reminderValues);
reminderAdapter.INSERT_CHECKBOX(checkboxValues);
File dbPath = getApplicationContext().getDatabasePath(ReminderHelper.DATABASE_NAME);
if(dbPath.exists()){
List<Reminder> reminders = new ReminderAdapter(helper).getAllReminders();
List<CheckBoxItem> checkBoxItems = new ReminderAdapter(helper).getAllCheckBoxes();
RAdapter = new RAdapter(reminders , getApplicationContext() , checkBoxItems);
reminderView.setAdapter(RAdapter);
}else{
}
Et la disposition du fichier :
<LinearLayout 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:orientation="vertical"
android:paddingBottom="8dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:paddingTop="8dp"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.smflog.sreminder.StartupActivity"
tools:showIn="@layout/app_bar_startup">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:id="@+id/reminder_recycler_view"
android:scrollbars="vertical"
android:layout_height="match_parent">
et à l'intérieur de ce recyclerView il y a un autre:
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/reminder_card"
card_view:cardCornerRadius="2dp"
card_view:cardElevation="4dp"
card_view:cardUseCompatPadding="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="16dp"
android:paddingLeft="8dp">
<com.smflog.sreminder.utils.TitleView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/reminder_title"
android:paddingTop="8dp"
android:text="Wellcome To Google Keep !"
android:textSize="15dp"
android:textStyle="bold" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content" android:orientation="horizontal">
<android.support.v7.widget.RecyclerView
android:layout_width="wrap_content"
android:id="@+id/checkbox_recycler_view"
android:layout_height="wrap_content">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
</LinearLayout>
</android.support.v7.widget.CardView>
Leurs cartes, Main ( RAdapter ) :
public class RAdapter extends RecyclerView.Adapter<RAdapter.ViewHolder> {
List<Reminder> reminder;
private Context context;
private LinearLayoutManager lln;
private CAdapter checkBoxAdapter;
private List<CheckBoxItem> checkBoxItems;
public static class ViewHolder extends RecyclerView.ViewHolder {
public CardView rCardView;
public RecyclerView recyclerView;
public TitleView rTitleView;
public ViewHolder(View itemView) {
super(itemView);
rCardView = (CardView) itemView.findViewById(R.id.reminder_card);
rTitleView = (TitleView) itemView.findViewById(R.id.reminder_title);
recyclerView = (RecyclerView) itemView.findViewById(R.id.checkbox_recycler_view);
}
}
public RAdapter(List<Reminder> reminder, Context context, List<CheckBoxItem> checkBoxItems) {
this.reminder = reminder;
this.context = context;
this.checkBoxItems = checkBoxItems;
}
@Override
public RAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.reminder_card, parent, false);
ViewHolder vh = new ViewHolder(v);
return vh;
}
@Override
public void onBindViewHolder(RAdapter.ViewHolder holder, int position) {
lln = new LinearLayoutManager(context);
holder.recyclerView.setLayoutManager(lln);
checkBoxAdapter = new CAdapter(checkBoxItems, context);
holder.recyclerView.setAdapter(checkBoxAdapter);
holder.rCardView.setCardBackgroundColor(Color.parseColor("#00796b"));
holder.rTitleView.setText(reminder.get(position).getReminderTitle());
}
@Override
public int getItemCount() {
return reminder.size();
}
}
Et deuxième Carte :
public class CAdapter extends RecyclerView.Adapter<CAdapter.ViewHolder> {
List<CheckBoxItem> checkBoxItems;
Context context;
public static class ViewHolder extends RecyclerView.ViewHolder {
public TitleView checkBoxTitle;
public ImageView deleteCheckBox;
public CheckBox checkBoxCheckBox;
public ViewHolder(View itemView) {
super(itemView);
checkBoxTitle = (TitleView) itemView.findViewById(R.id.checkbox_item_text);
checkBoxCheckBox = (CheckBox) itemView.findViewById(R.id.checkbox_item_checkbox);
Log.d("CAdapterLog", "Adpater Holded !!!!! :( ");
deleteCheckBox = (ImageView) itemView.findViewById(R.id.btn_delete_checkbox);
}
}
public CAdapter(List<CheckBoxItem> checkBoxItems, Context context) {
this.checkBoxItems = checkBoxItems;
this.context = context;
Log.d("CAdapterLog", "Adpater Created !!!!! :( ");
}
@Override
public CAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.checkbox_item, parent, false);
ViewHolder vh = new ViewHolder(v);
Log.d("CAdapterLog", "Adpater ViewHolded :( !!!!! :( ");
return vh;
}
@Override
public void onBindViewHolder(CAdapter.ViewHolder holder, int position) {
Boolean isCheckboxChecked = Boolean.parseBoolean(checkBoxItems.get(position).getCheckBoxIsDone());
String checkBoxText = checkBoxItems.get(position).getCheckBoxBody();
Log.d("CAdapterLog", "Adpater Binded :( ");
final int checkboxID = Integer.parseInt(checkBoxItems.get(position).getCheckBoxID());
int reminderCheckBoxID = Integer.parseInt(checkBoxItems.get(position).getCheckBoxReminderID());
holder.deleteCheckBox.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("CAdapterLog", "Cross Button Clicked !");
}
});
holder.checkBoxCheckBox.setChecked(isCheckboxChecked);
holder.checkBoxTitle.setText(checkBoxText);
}
@Override
public int getItemCount() {
return checkBoxItems.size();
}
}
Et mon problème: comme vous le voyez dans CAdapter, seulement du constructeur Journal message affiché.
Mise à JOUR: si il est une autre façon d'afficher des données dynamiques à l'intérieur d'une autre dynamique de la carte si oui, est-il préférable de l'utiliser au lieu de recyclerView?
quelqu'un m'aider?
La sortie : La sortie de l'Application
comme vous le voyez juste la setTitle pour RAdapter œuvres.
- Êtes-vous essayer de réinventer la ExpandableListView?
- Ma liste de données n'est pas extensible.Je pense que le problème vient de ma carte mais vous ne savez pas quel est le problème ??
- y vous voulez recyclerview à l'intérieur d'autres recyclerview simplement votre solution de plus ce n'est pas bon pour la performance
- quelle solution proposez-vous ?
- peut;t pensent tout de suite, mais celui que vous utilisez est mauvais c'est wht je peux dire... si vous pouvez me montrer des écrans, alors je peut sugest quelque chose 🙂
- Vous ne devriez pas mettre plusieurs RecyclerViews à l'intérieur les uns des autres. Surtout dans ton cas où ils ont le même axe de défilement (à la verticale). Je pense que vous devriez trouver un meilleur moyen de la section de vos données, ou tout simplement ajouter manuellement une dynamique d'un nombre de cases à cocher pour vos cartes dans la première carte.
- Comme vous le voyez dans GoogleKeep. il y a quelques cases à cocher de chaque carte. comment faire un ListView dans RecyclerView ?
Vous devez vous connecter pour publier un commentaire.
Je voudrais suggérer d'utiliser un seul
RecyclerView
et remplir la liste de vos éléments de façon dynamique. J'ai ajouté un projet github pour décrire la façon dont cela peut être fait. Vous pourriez avoir un coup d'oeil. Tandis que les autres solutions fonctionnent très bien, j'aimerais suggérer, c'est beaucoup plus rapide et efficace façon de montrer plusieurs listes dans unRecyclerView
.L'idée est d'ajouter de la logique dans votre
onCreateViewHolder
etonBindViewHolder
méthode de sorte que vous pouvez gonfler bonne vue pour la position exacte de votreRecyclerView
.J'ai ajouté un exemple de projet avec wiki. Vous pourriez cloner et de vérifier ce qu'il fait.
Il y a une autre façon de garder vos articles dans un seul
ArrayList
des objets de sorte que vous pouvez définir un attribut de marquage les éléments à indiquer quel est l'élément de la première liste et que l'on appartient à la deuxième liste. Passer ensuite queArrayList
dans votreRecyclerView
puis de mettre en œuvre la logique à l'intérieur de l'adaptateur afin de les remplir de façon dynamique.Espère que ça aide.
RecyclerView
à l'aide de différentsViewType
pour les listes qui vont être inséré montré dans le mêmeRecyclerView
. Toutefois, si vous avez besoin d'avoir de multiplesRecyclerView
, alors s'il vous plaît utiliser unNestedScrollView
et de mettre plusieursRecyclerView
en elle. Les listes sont codés en dur dans le github exemple, mais la liste peut être dynamique. Les valeurs codées en dur sont juste pour l'exemple. J'espère que vous comprenez.J'ai rencontré le même problème un temps, et ce qui se passait dans mon cas a l'extérieur recycleur vue fonctionnait parfaitement bien, mais la carte interne/seconde recycleur a des problèmes mineurs de toutes les méthodes comme le constructeur fus initié et même getCount() la méthode a été appelée, bien que le dernier responsable méthodes pour générer la vue de ie..
1. onBindViewHolder() méthodes ne l'ai jamais appelé. --> Problème 1.
2. Quand il m'a appelé, enfin, il n'a jamais montrer les éléments de la liste/les lignes de recycleur de vue. --> Problème 2.
Raison d'être de ce qui s'est passé :: Lorsque vous mettez un recycleur de vue à l'intérieur d'un autre recycleur de vue, à la hauteur de la première/extérieur recycleur de vue n'est pas automatique ajusté. Il est défini lors de la première/extérieur vue est créée et puis, il reste fixe. À ce moment, le deuxième/intérieure recycleur de vue n'a pas encore chargé de ses éléments et donc sa hauteur est définie comme égale à zéro et ne change jamais, même lorsqu'il fait des données. Puis, quand onBindViewHolder() dans votre seconde/intérieure recycleur vue est appelé, il obtient d'articles, mais il n'a pas l'espace pour leur montrer à cause de sa hauteur est toujours égale à zéro. Donc, les éléments de la deuxième recycleur de vue ne sont jamais montré, même si les onBindViewHolder() a ajouté à elle.
Solution : vous avez à créer sur mesure vos LinearLayoutManager pour la deuxième recycleur de vue et c'est tout.
Pour créer votre propre LinearLayoutManager: Créer une classe Java avec le nom
CustomLinearLayoutManager
et de coller le code ci-dessous dans il. PAS DE MODIFICATION REQUISEvous pouvez utiliser LayoutInflater pour gonfler votre dynamique de données en tant que fichier de mise en page.
Mise à JOUR : d'abord créer un LinearLayout à l'intérieur de votre CardView de mise en page et de lui attribuer un ID pour elle.
après cela, créez un fichier de mise en page que vous voulez à gonfler. enfin dans votre
onBindViewHolder
méthode dans votre "RAdaper" de la classe. écrire ces codes :après cela, vous pouvez initialiser les données et ClickListeners avec votre RAdapter de Données. espérons que cela aide.
cette et cette peut être utile 🙂