版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/S43565442/article/details/53007010
要求实现一个可以一次创建多个班级的功能,效果如下图:
其中班级名和专业是一个可以复用的子view,直接使用View addView = LayoutInflater.from(CreateClassActivity.this).inflate(R.layout.add_class_view, null);
parent.addView(addView);总是会出现一个问题,不管点选哪一个子view的专业都改变的是最后一个。出现这个问题的原因就是没有区别开view的id。借鉴http://blog.csdn.net/qq_21451721/article/details/51613513 这篇博客仅以记录。
容器布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<RelativeLayout
android:id="@+id/rl_title"
android:layout_width="match_parent"
android:layout_height="@dimen/base50dp"
android:background="@drawable/retangle_white">
<include
android:id="@+id/back"
layout="@layout/back_button" />
<TextView
android:id="@+id/tv_title"
style="@style/tv_contact_title"
android:text="创建班级" />
</RelativeLayout>
<ScrollView
android:id="@+id/add_class_dialog"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@+id/bt_add_class"
android:layout_below="@+id/rl_title">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="vertical">
<!-- 装重复动态布局的容器-->
<LinearLayout
android:id="@+id/parent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
</LinearLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="@dimen/base60dp"
android:layout_alignParentRight="true"
android:layout_marginTop="@dimen/base5dp">
<View
android:id="@+id/v_delete_class"
android:layout_width="@dimen/base35dp"
android:layout_height="@dimen/base35dp"
android:layout_centerVertical="true"
android:layout_marginRight="@dimen/base20dp"
android:layout_toLeftOf="@+id/v_add_class"
android:background="@drawable/delete_mem" />
<View
android:id="@+id/v_add_class"
android:layout_width="@dimen/base35dp"
android:layout_height="@dimen/base35dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_marginRight="@dimen/base20dp"
android:background="@drawable/add_mem" />
</RelativeLayout>
</LinearLayout>
</ScrollView>
<Button
android:id="@+id/bt_add_class"
style="@style/button_background"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="@dimen/base22dp"
android:text="确定" />
</RelativeLayout>
重复使用布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/add_class_add_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/base10dp"
android:orientation="horizontal"
android:paddingLeft="@dimen/base20dp">
<TextView
android:layout_width="0dp"
android:layout_height="@dimen/base40dp"
android:layout_weight="1"
android:gravity="center"
android:text="班级名:"
android:textColor="#000000"
android:textSize="18sp" />
<EditText
android:id="@+id/create_class_et_class_name"
android:layout_width="0dp"
android:layout_height="@dimen/base40dp"
android:layout_marginRight="@dimen/base20dp"
android:layout_weight="3"
android:background="@drawable/background_tv_name"
android:ellipsize="end"
android:gravity="center_vertical"
android:hint="请输入班级名称"
android:singleLine="true"
android:textColor="#000000"
android:textSize="16sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/create_class_ll_pro_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/base10dp"
android:orientation="horizontal"
android:paddingLeft="@dimen/base20dp">
<TextView
android:layout_width="0dp"
android:layout_height="@dimen/base40dp"
android:layout_weight="1"
android:gravity="center"
android:text="专业:"
android:textColor="#000000"
android:textSize="18sp" />
<RelativeLayout
android:layout_width="0dp"
android:layout_height="@dimen/base40dp"
android:layout_marginRight="@dimen/base20dp"
android:layout_weight="3"
android:background="@drawable/background_tv_name"
android:gravity="center_vertical">
<TextView
android:id="@+id/create_class_tv_pro_name"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:ellipsize="end"
android:gravity="center_vertical"
android:hint="请输入"
android:singleLine="true"
android:textColor="#000000"
android:textSize="16sp" />
<View
android:layout_width="10dp"
android:layout_height="10dp"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:layout_gravity="bottom"
android:layout_marginBottom="@dimen/base15dp"
android:background="@drawable/select_right_down" />
</RelativeLayout>
</LinearLayout>
</LinearLayout>
初始化:
private List<View> viewList;
private List<ViewHolder> viewHolderList;
private int mark = 0;
private String classNames = "";
private String proIds = "";
protected void initView() {
viewList = new ArrayList<>();
viewHolderList = new ArrayList<>();
View addView = LayoutInflater.from(CreateClassActivity.this).inflate(R.layout.add_class_view, null);
addView.setId(mark);
parent.addView(addView, mark);
getViewInstance(addView);
}
private void getViewInstance(View addView) {
ViewHolder vh = new ViewHolder();
vh.id = addView.getId();
vh.create_class_et_class_name = (EditText) addView.findViewById(R.id.create_class_et_class_name);
vh.create_class_ll_pro_name = (LinearLayout) addView.findViewById(R.id.create_class_ll_pro_name);
vh.create_class_tv_pro_name = (TextView) addView.findViewById(R.id.create_class_tv_pro_name);
// 设置监听
vh.create_class_ll_pro_name.setOnClickListener(selectProListener);
viewHolderList.add(vh);
viewList.add(addView);
}
View.OnClickListener selectProListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
View view = (View) v.getParent();
for (int i = 0; i < parent.getChildCount(); i++) {
ViewHolder viewHolder = viewHolderList.get(i);
DebugUtil.E("createclass", "view.getId()==" + view.getId() + " viewHolder.id==" + viewHolder.id);
if (view.getId() == viewHolder.id) {
onProfession(App.sp.getString(GlobalConstants.ORGID, ""), App.sp.getString(GlobalConstants.SCHID, ""), viewHolder.create_class_tv_pro_name, viewHolder.id);
}
}
}
};
public class ViewHolder {
private int id = -1;
private EditText create_class_et_class_name;
private LinearLayout create_class_ll_pro_name;
private TextView create_class_tv_pro_name;
}
添加删除事件:
mark++;
View addView = LayoutInflater.from(CreateClassActivity.this).inflate(R.layout.add_class_view, null);
addView.setId(mark);
parent.addView(addView);
getViewInstance(addView);
int childNum = parent.getChildCount();
if (childNum > 1) {
parent.removeViewAt(childNum - 1);
viewHolderList.remove(viewHolderList.size() - 1);
viewList.remove(viewList.size() - 1);
mark--;
}
最后是保存,保存的时候循环遍历就行:
for (int i = 0; i < parent.getChildCount(); i++) {
ViewHolder viewHolder = viewHolderList.get(i);
String className = viewHolder.create_class_et_class_name.getText().toString().trim();
String proName = viewHolder.create_class_tv_pro_name.getText().toString().trim();
String proId = (String) viewHolder.create_class_tv_pro_name.getTag();
DebugUtil.E("addClass", "className==" + className);
DebugUtil.E("addClass", "proName==" + proName);
DebugUtil.E("addClass", "proId==" + proId);
}
最后,需要说明的是,动态添加的子布局中需要有点击事件的布局必须放在第二层布局中,否则通过view.getParent()得到的就和原本存储的父布局不是同一个,会造成点击事件没有响应。