使用自定义复合视图作为Listview的项目

时间:2013-06-28 00:30:55

标签: android

问题:

我开发了自定义复合视图,我不确定如何在列表视图中显示它。

我做了什么:

- >我的自定义复合视图

public class HZScrollView extends LinearLayout {

public HZScrollView(Context context) {
    super(context);
    initView(context);
}

   private void initView(Context context) {

        mContext = context;

        setOrientation(LinearLayout.HORIZONTAL);
        setGravity(Gravity.CENTER_VERTICAL);
        ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                                                               ViewGroup.LayoutParams.WRAP_CONTENT);
        this.setLayoutParams(lp);

        //inflate XML resource and attach
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mInflater.inflate(R.layout.hz_scroll_view, this, true);
    }
}

public void addContent(String name, String age, String sex) {
//content is added to the individual widgets within this compound view
}

- >我的适配器

public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) {
convertView = new HZScrollView(context); //<--- PROBLEM !
}
}

我遇到的主要问题是标有“问题”的行导致异常java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.app/.MainActivity}: android.view.InflateException: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true

在'net周围的示例代码中,getView()通常会扩展XML布局,但在我的情况下,复合视图是完全独立的。

问题:

如何将自定义复合视图插入/附加到listview项目中?

1 个答案:

答案 0 :(得分:0)

<强>解决方案:

1)在适配器中,将HZScrollView分配给convertView是好的

2)要解决LayoutParams的另一个问题,需要更新initView()以使用AbsListView.LayoutParams而不是ViewGroup.LayoutParams(因为父容器是listView)

3)为了修复Inf​​lateException,在XML中使用了<merge>的子视图,我重构了将子视图包装在LinearLayout中。注意:在XML中为“hz_scroll_view”文件使用<merge>就可以了。


对我来说,真正有趣的部分是第1点,因为我不确定是否可以将自定义复合视图分配给列表视图项。