web-dev-qa-db-fra.com

liste de contrôle imbriquée Android

est-il possible/conseillé d'avoir une liste de contrôle imbriquée?

c'est-à-dire un listView contenu dans une rangée d'un autre listview?

un exemple serait où ma liste principale affiche des articles de blog, puis dans chaque ligne, vous auriez une autre vue de liste pour les commentaires de chaque article (ce serait pliable) 

28
Ben

J'ai eu le même problème aujourd'hui, alors voici ce que j'ai fait pour le résoudre:

J'ai un ListView, avec un CustomAdapter, et sur le getView du customAdapter, j'ai quelque chose comme ça:

LinearLayout list = (LinearLayout) myView.findViewById(R.id.list_musics);
list.removeAllViews();

for (Music music : albums.get(position).musics) {
    View line = li.inflate(R.layout.inside_row, null);

    /* nested list's stuff */

    list.addView(line);
}

Donc, en reprenant, il n'est pas possible d'imbriquer dans ListViews, mais vous pouvez créer une liste dans une ligne en utilisant LinearLayout et en la renseignant avec du code.

31
Paulo Cesar

Est-ce que vous cherchez le ExpandableListView ? Bien sûr, cela ne concerne que deux niveaux d’annonces (mais cela semble correspondre à vos besoins).

11
kiswa

Cela ça ressemble à ce que vous cherchez? Si ce n'est pas le cas ou si cela ne fonctionne pas, je vous suggérerais de disposer de deux vues de liste: une des publications de blog, par exemple, et le second de commentaires, et une action sur un élément de publication de blog vous conduisant à la seconde , rempli avec les commentaires pertinents. 

6
Kris

vous pouvez le faire comme ça: 

à l'intérieur de la mise en page XML de la liste de diffusion parent, ajoutez la mise en page suivante 

   <TableLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:id="@+id/table_show"
        Android:background="#beb4b4">
    </TableLayout>

alors vous devez faire une mise en page pour la liste des enfants avec le nom reply_row.xml

<?xml version="1.0" encoding="utf-8"?>
<TableRow Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:layout_marginTop="3dp"
    xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <TextView
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:id="@+id/tv_reply_row"
        Android:textColor="#000"/>
</TableRow>

dans la méthode getview de l'adaptateur listview parent, ajoutez le code suivant:

TableLayout replyContainer = (TableLayout) 
// vi is your parent listview inflated view
vi.findViewById(R.id.table_show); 
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);


       //child listview contents list
        String [] replys = {"a","b","c","d"};

        for (int i=0;i<replys.length;i++)
        {
        final View comments = inflater.inflate(R.layout.reply_row, null);
        TextView reply_row = (TextView) comments.findViewById(R.id.tv_reply_row) ;
        reply_row.setText(replys[i]);

//for changing your tablelayout parameters 
        TableLayout.LayoutParams tableRowParams=new TableLayout.LayoutParams
                      (TableLayout.LayoutParams.FILL_PARENT,TableLayout.LayoutParams.WRAP_CONTENT);

        int leftMargin=3;
        int topMargin=2;
        int rightMargin=3;
        int bottomMargin=2;
        tableRowParams.setMargins(leftMargin, topMargin, rightMargin, bottomMargin);
        comments.setLayoutParams(tableRowParams);
            TableRow tr = (TableRow) comments;
            replyContainer.addView(tr);
          }
0
Ahmed Esameddeen

Vous feriez mieux d'utiliser un seul ListView, pas imbriqué. L'imbrication de ListView est une méthode inefficace. Votre ListView peut ne pas défiler correctement et prendre plus de mémoire.

Vous pouvez organiser votre structure de données pour afficher les données imbriquées dans un seul ListView. Ou vous pouvez utiliser ce projet PreOrderTreeAdapter . Il est pratique d'afficher les données imbriquées dans ListView ou RecyclerView. Il peut être utilisé pour rendre ListView ou RecyclerView pliable, il suffit de changer la façon dont vous fournissez vos données plutôt que de notifier l'adaptateur.

0
user3510029