问题:
向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()
(下一次会慢一点)。
有什么优点和缺点?
答案 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),因为布局中只有一个小部件。