Как вложить ListViews? - PullRequest
       7

Как вложить ListViews?

0 голосов
/ 08 декабря 2010

Так вот в чем проблема.Я пишу приложение, которое запрашивает данные в веб-сервисе.Возвращаемые данные - это произвольное количество строк.

Мне нужно отобразить список этих строк, что, очевидно, проще всего сделать, вложив 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.Однако результат тот же.

У кого-нибудь есть идеи, как это исправить, чтобы показать два элемента в каждом из внутренних списков?

1 Ответ

1 голос
/ 08 декабря 2010

почему вы не используете ExpandableListActivity с их ExpandableListView и ExpandableListAdapter, если вы их используете, уже есть методы: getChild, getGroup, и вы можете создавать разные View для родителей и детей ...

...