Так вот в чем проблема.Я пишу приложение, которое запрашивает данные в веб-сервисе.Возвращаемые данные - это произвольное количество строк.
Мне нужно отобразить список этих строк, что, очевидно, проще всего сделать, вложив ListView в другой ListView.Это делает ListView, строки которого содержат другие ListViews.Проблема, с которой я столкнулся, заключается в том, что когда я делаю это, внутренние ListViews отображают только первый элемент в массиве поддержки.
Я использую собственный ListAdapter, который расширяет BaseAdapter.Используя отладчик Eclipse, я смог определить, что метод getView (int, View, viewGroup) для каждого экземпляра (по одному для каждой строки во вложенном ListView) всегда вызывается три раза, но всегда с одним и тем же аргументом int(это 0).Количество вызовов getView () для ListAdapter, по-видимому, мало связано с количеством элементов, содержащихся в массиве поддержки.
Я создал довольно простое тестовое приложение, которое иллюстрирует, что яна самом деле.
Это мой ListAdapter.Другой ListAdapter, вложенный InnerListAdapter, используется для заполнения внутренних списков.
package org.my.tests;
import java.util.List;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class NestedListAdapter extends BaseAdapter {
Context context;
List<List<String>> list;
public NestedListAdapter(Context context, List<List<String>> list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ListView view = new ListView(context);
view.setAdapter(new InnerListAdapter(list.get(position)));
return view;
}
public class InnerListAdapter extends BaseAdapter {
List<String> list;
public InnerListAdapter(List<String> list) {
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView view = new TextView(context);
view.setText(String.valueOf(position) + ' ' + list.get(position));
return view;
}
}
}
Это код для моего Activity-класса:
package org.my.tests;
import java.util.ArrayList;
import java.util.List;
import android.app.ListActivity;
import android.os.Bundle;
public class ListViewTest extends ListActivity {
private static final List<List<String>> lists = new ArrayList<List<String>>(3);
static {
List<String> list = new ArrayList<String>(2);
list.add("a");
list.add("b");
lists.add(list);
list = new ArrayList<String>(2);
list.add("c");
list.add("d");
lists.add(list);
list = new ArrayList<String>(2);
list.add("e");
list.add("f");
lists.add(list);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_view_test);
setListAdapter(new NestedListAdapter(this, lists));
}
}
Пользовательский ListAdapter, используемый в фактическомПриложение намного сложнее и использует инфляцию макета для вложенных ListViews.Однако результат тот же.
У кого-нибудь есть идеи, как это исправить, чтобы показать два элемента в каждом из внутренних списков?