在Android上显示嵌套列表

时间:2012-10-08 11:25:17

标签: android android-layout android-listview

我需要显示A对象列表(想想List<A>)。 A具有以下结构:

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

所有三个列表都可以是任意长度的。 bListcList应在As列表的每一行中以其整个长度显示。每个列表都由SQLite游标支持。这是一种日历视图。下图说明了这个想法:

enter image description here

现在,我想知道以“Android方式”实现这一目标的最佳方法是什么。我尝试了很多东西:

  1. ListView for A,嵌套ListViews用于B和C:不推荐,很难禁用B和C的滚动行为。
  2. ListView for A with LinearLayout for B and C,并以编程方式将子视图添加到适配器中的LinearLayouts:我必须管理B和C的Cursor更新并自行调整行的高度,大量的视图管理代码在适配器不属于它。
  3. 组合嵌套LinearLayouts的所有内容:与2相同的问题,甚至更多的游标要处理。
  4. 也许我可以通过不同的方式充分利用现有功能?

    我已经看过StackOverflow上的类似问题了。最重要的两个建议似乎是:

    • 在多个活动/片段上传播数据:被认为是一种选择,因为不是用户友好的(在这种情况下)。
    • 使用ExpandableListView:似乎不适用于数据结构,Bs和Cs列表应该从一开始就可见。

1 个答案:

答案 0 :(得分: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的一部分

ANd IBean是java bean类,在列表中包含你的5 iTem。 您不想要的任何项目都将其留空。