2012-10-08 59 views
0

我需要显示A对象列表(请考虑List<A>)。 A具有以下结构:在Android上显示嵌套列表

class A { 
    List<B> bList; 
    List<C> cList; 
} 

所有三个列表可以是任意长度。 bListcList应该以其全部长度显示在As列表的每一行中。每个列表都由一个SQLite游标支持。这是一种日历视图。下图描述了一个思路:

enter image description here

现在,我不知道什么是实现这一目标“在Android方式”的最佳途径。我试图多件事情:

  1. 的ListView对于A与B和C的嵌套列表视图:不建议,硬禁用B和C的滚动行为
  2. 的ListView对于A具有的LinearLayout为B和C以及编程将子视图添加到适配器中的LinearLayouts中:我必须管理B和C的Cursor更新并自己调整行的高度,以及适配器中不属于的大量视图管理代码。
  3. 编写嵌套的LinearLayouts的所有内容:与2相同的问题,甚至更多的游标需要处理。

也许我有充分利用现有功能的不同方法吗?

我已经看过StackOverflow上的类似问题。前两名的建议似乎是:在多个活动/片段

  • 传播数据:考虑,而不是一种选择,因为没有用户(在这种情况下)友好。
  • 使用ExpandableListView:似乎不适用于数据结构,Bs和Cs的列表应该从一开始就可见。

回答

0

要实现这种类型的视图,你需要实现两件事。

ListView listView; 
IArrayAdapter iArrayAdapter; 

用xml提供的id初始化listView。

Activity.this.runOnUiThread(new Runnable() { 
     public void run() { 
      iArrayAdapter = new IArrayAdapter(Activity.this, 
        R.layout.list_item, "list of items group it from Bean"); 
      listView.setAdapter(iArrayAdapter); 
      iArrayAdapter.notifyDataSetChanged(); 
     } 
    }); 

list_item是您需要在列表中显示内容类型的另一种布局。

IArrayAdapter是类扩展ArrayAdapter

public class IArrayAdapter extends ArrayAdapter<IBean> { 

private final Activity context; 
private final ArrayList<IBean> iBeans; 
private int resourceId; 

public InboxArrayAdapter(Activity context, int resourceId, 
     ArrayList<IBean> iBeans) { 
    super(context, resourceId, inboxBeans); 
    this.context = context; 
    this.iBeans = iBeans; 
    this.resourceId = resourceId; 
} 

/* 
* TO update View 
* 
* @see android.widget.ArrayAdapter#getView(int, android.view.View, 
* android.view.ViewGroup) 
*/ 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View rowView = convertView; 
    if (rowView == null) { 
     LayoutInflater layoutInflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     rowView = layoutInflater.inflate(resourceId, null); 

    final IBean iBean = iBeans.get(position); 
    final ImageView imageView = (ImageView) rowView 
      .findViewById(R.id.message); 
    final TextView rowTxt = (TextView) rowView 
      .findViewById(R.id.senderName); 
    final TextView rowTxt1 = (TextView) rowView 
      .findViewById(R.id.senderMessage); 
    final TextView rowTxt2 = (TextView) rowView 
      .findViewById(R.id.senderTime); 
    final CheckBox check = (CheckBox) rowView.findViewById(R.id.check); 
    .....set text here..... 
return rowView; 
} 

}

的ImageView,rowtext等的布局LIST_ITEM的一部分

和IBean是Java bean类包含的5项在列表中。 任何你不想让它留空的项目。

+0

谢谢你的回答。据我所知,你只使用一个ListView(这将是我的问题中的A对象列表)。但是我总共有三个游标(用于A,B和C对象的列表)。沿着你的建议,它们必须出现在适配器的'getView()'方法的某处,并且适配器必须实现'LoaderManager.LoaderCallbacks '。对?感觉有点不对我... – aha

+0

在这里th行 iArrayAdapter = new IArrayAdapter(Activity.this, R.layout.list_item,“项目列表从Bean组”);我正在传递类型Ibean的数组列表,如您的案例类“A”。您要在布局list_item中提供的B或C列表的视图部分最大长度。 我需要了解LoaderManager.LoaderCallbacks 。 –