向视图组动态添加无限数量的视图

时间:2016-05-18 08:51:15

标签: android android-layout android-xml

问题:

向LinearLayout添加动态复选框。 目前的子视图范围2-7,但数量不受限制。

我的第一个方法是纯粹的代码:

LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);  
lp.gravity = Gravity.CENTER;

for (String answer : generateAnswers()) {
    CheckBox checkBox = new CheckBox(getContext());
    checkBox.setTextSize(TypedValue.COMPLEX_UNIT_SP, 17);
    checkBox.setGravity(Gravity.CENTER);
    checkBox.setText(answer);
    mvAnswersLayout.addView(checkBox, lp);
}

像CheckBox项目的感觉应该存在于xml中,所以第二种变体:

LayoutInflater inflater = LayoutInflater.from(getActivity());
for (String answer : generateAnswers()) {
    View v = inflater.inflate(R.layout.answer_item, mvAnswersLayout, true);
    CheckBox checkBox = (CheckBox) v.findViewById(R.id.checkbox_id);
    checkBox.setText(answer);
    checkBox.setId(General.generateViewId());
}

<merge xmlns:android="http://schemas.android.com/apk/res/android">
    <CheckBox
        android:id="@+id/checkbox_id"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textSize="17sp"
        android:padding="4dp"
        />
</merge>

要消除冗余视图组,我使用标记<merge>和实用程序View.generateViewId()

似乎第二种方法是每个Android开发人员都期望的方式。但困扰我的是多次击中findViewById()(下一次会慢一点)。

有什么优点和缺点?

2 个答案:

答案 0 :(得分:1)

如果您有许多复选框,最好将每行使用Recyclerview或Listview作为复选框以获得更好的性能。在recylerview或listview中也很容易保持状态。

答案 1 :(得分:0)

如果要在不使用RecycleView或ListView的情况下动态添加,可以创建如下所示的复选框

 ViewGroup.LayoutParams checkbox_relativeParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            checkbox_relativeParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
            checkbox_relativeParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
            CheckBox cb = new CheckBox(getActivity());
            cb.setText("I'm dynamic!");
            cb.setGravity(Gravity.CENTER);
            cb.setTextSize(17);
            cb.setPadding(4,4,4,4);
            cb.setLayoutParams(checkbox_relativeParams);

并动态地将此复选框添加到布局中。

 this.addView(cb, checkbox_relativeParams);

请求findViewbyID(id),因为布局中只有一个小部件。