如何嵌套ListViews?

时间:2010-12-08 19:36:33

标签: android user-interface listview layout listadapter

所以这就是问题所在。我正在编写一个应用程序来查询Web服务以获取某些数据。返回的数据是任意数量的字符串。

我需要显示这些字符串的列表,这显然最容易通过将ListView嵌套在其他ListView中来完成。这是一个ListView,其行包含其他ListViews。我遇到的问题是,当我这样做时,内部ListViews只显示支持数组中的第一个元素。

我正在使用扩展BaseAdapter的自定义ListAdapter。使用Eclipse调试器我已经能够确定每个实例的getView(int,View,viewGroup)方法(嵌套ListView中每一行一个)总是被调用三次,但总是使用相同的int-argument (即0)。调用ListAdapter的getView()的次数似乎与支持数组包含的元素数量没什么关系。

我创建了一个相当简单的测试应用程序来说明我实际在做什么。

这是我的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-class的代码:

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要复杂得多,并且对嵌套的ListView使用布局膨胀。但结果是一样的。

有没有人对如何解决此问题有任何想法,以显示每个内部列表中的两个元素?

1 个答案:

答案 0 :(得分:1)

为什么你不使用ExpandableListActivity与他们的ExpandableListView和ExpandableListAdapter,如果你使用它们,已经有了方法:getChild,getGroup你可以为父母和孩子建立不同的视图......

相关问题