0

問題:

カスタム複合ビューを開発しましたが、それをリストビューに表示する方法がわかりません。

私がやったこと:

-> 私のカスタム複合ビュー

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

ネットのサンプル コードでは、getView() は通常 XML レイアウトをインフレートしますが、私の場合、複合ビューは完全に自己完結型です。

質問:

カスタム複合ビューをリストビュー項目に挿入/添付するにはどうすればよいですか?

4

1 に答える 1

1

解決:

1) アダプターでは、HZScrollView を convertView に割り当てても問題ありません。

2) LayoutParams に関する別の問題を修正するには、ViewGroup.LayoutParams の代わりに AbsListView.LayoutParams を使用するように initView() を更新する必要がありました (親コンテナーが listView であるため)。

3) <merge>XML で使用される子ビューである InflateException を修正するために、子ビューを LinearLayout でラップするようにリファクタリングしました。注: <merge>「hz_scroll_view」ファイルの XML で使用しても問題ありません。


私にとって本当に興味深いのは、リストビュー アイテムにカスタム複合ビューを割り当てることができるかどうか確信が持てなかったため、ポイント #1 でした。

于 2013-06-28T18:59:48.677 に答える