web-dev-qa-db-ja.com

androidネストされたリストビュー

ネストされたリストビューを持つことは可能/お勧めですか?

つまり、別のリストビューの行に含まれているリストビューですか?

例としては、私のメインリストにブログの投稿が表示され、各行に、各投稿のコメントの別のリストビューがあります(これは折りたたみ可能です)。

28
Ben

今日も同じ問題があったので、これを解決するために私がやったことは次のとおりです。

CustomAdapterを含むListViewがあり、customAdapterのgetViewには次のようなものがあります。

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);
}

したがって、再開すると、ListViewにネストすることはできませんが、LinearLayoutを使用して行内にリストを作成し、コードを入力することができます。

32
Paulo Cesar

ExpandableListView を探していますか?もちろん、これは2つのレベルのリストに限定されています(ただし、ニーズに合わせて機能すると思われます)。

11
kiswa

これ 探しているもののように聞こえますか?そうでない場合、またはこれが機能しない場合は、2つのリストビューを用意することをお勧めします。たとえば、ブログ投稿と2番目のコメントの1つです。ブログ投稿アイテムに対するアクションにより、2番目のビューに移動します。 、関連するコメントが入力されています。

6
Kris

あなたはこのようにそれを行うことができます:

親リストビュー行xmlレイアウト内に次のテーブルレイアウトを追加します

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

次に、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>

親リストビューアダプターのgetviewメソッドに次のコードを追加します。

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

ネストするのではなく、1つのリストビューを使用することをお勧めします。 ListViewのネストは非効率的な方法です。 ListViewがスムーズにスクロールせず、より多くのメモリを消費する場合があります。

データ構造を編成して、ネストされたデータを1つのリストビューに表示できます。または、このプロジェクト PreOrderTreeAdapter を使用できます。 ListViewまたはRecyclerViewでネストされたデータを表示すると便利です。 ListViewまたはRecyclerViewを折りたたみ可能にするために使用できます。アダプターに通知するのではなく、データを提供する方法を変更するだけです。

0
user3510029