Список вложенных списков в Android
Возможно ли/целесообразно иметь вложенный список?
то есть. listView, который содержится в строке другого списка?
пример будет, когда в моем главном списке отображаются сообщения в блоге, а затем в каждой строке у вас будет другое представление списка для комментариев для каждого сообщения (которое будет сбрасываемым)
Ответы
Ответ 1
У меня была такая же проблема сегодня, поэтому я решил ее решить:
У меня есть 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 stuff */
list.addView(line);
}
Итак, возобновление, Невозможно вложить в ListViews, но вы можете создать список внутри строки с помощью LinearLayout и заполнить его кодом.
Ответ 2
Это то, что вы ищете ExpandableListView? Конечно, это ограничено только двумя уровнями списков (но похоже, что это сработает для ваших нужд).
Ответ 3
Этот звук звучит так, как будто вы ищете? Если вы этого не сделаете, или если это не сработает, я бы предложил иметь два вида списка: один из, скажем, сообщений в блогах, и второй комментарий, а действие в блоге отправляет вас во второе представление, заполненный соответствующими комментариями.
Ответ 4
вы можете сделать это следующим образом:
внутри родительского макета списка xml listview добавить следующий макет таблицы
<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-адаптера listview добавьте следующий код:
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);
}
Ответ 5
Вам лучше использовать один ListView, а не вложенный. Вложение ListView является неэффективным. Ваш ListView не может плавно прокручиваться и занимать больше памяти.
Вы можете организовать свою структуру данных для отображения вложенных данных в один ListView. Или вы можете использовать этот проект PreOrderTreeAdapter.
Удобно отображать вложенные данные в ListView или RecyclerView. Его можно использовать для создания списков ListView или RecyclerView, просто изменив способ предоставления ваших данных, чем уведомлять адаптер.