Android 动态添加view或item并获取数据的实例
最近在做一项目,项目中用到了一个功能,要求是动态item,而且是多个的情况下,不过仔细的分析了下,都大同小异,做起来也很简单,在这里我只抽取出来做了一demo,也只做了一个动态添加item,同时可以获取所有添加和编辑item上的数据,先上图:
我们先来分析一下这个demo:
两个textview和edittext,一个button,一个星级评价ratingbar控件,布局完事…
activity_dynamic的布局,有可能会添加多个,所以外面用scrollview,因为我们是垂直方向添加,所以使用linearlayout做容器
<?xml version="1.0" encoding="utf-8"?> <scrollview xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <relativelayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:padding="10dp"> <linearlayout android:id="@+id/ll_addview" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" /> <button android:id="@+id/btn_getdata" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/ll_addview" android:layout_margintop="10dp" android:background="@drawable/em_btn_green_selector" android:text="获取数据" /> </relativelayout> </scrollview>
再看看要添加的item_hotel_evaluate里面的布局:
<?xml version="1.0" encoding="utf-8"?> <relativelayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/rl_hotelname" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/editbox_background_normal"> <linearlayout android:id="@+id/rl_addhotel" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <textview android:id="@+id/tv_hotelname" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginleft="5dp" android:layout_weight="1" android:text="酒店名称:" android:textsize="18sp" /> <edittext android:id="@+id/ed_hotelname" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="2" android:background="@drawable/editbox_background_normal" android:padding="5dp" android:singleline="true" /> <button android:id="@+id/btn_addhotel" android:layout_width="0dp" android:layout_height="30dp" android:layout_weight="1" android:background="@drawable/em_btn_green_selector" android:text="+新增" android:textcolor="@color/white" android:textsize="18sp" /> </linearlayout> <linearlayout android:id="@+id/ll_addhotelevaluate" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/rl_addhotel" android:layout_margintop="5dp" android:orientation="vertical"> <relativelayout android:id="@+id/rl_hotelevaluate" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/rl_addhotel" android:layout_margintop="5dp" android:orientation="horizontal"> <textview android:id="@+id/tv_hotelserver" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentleft="true" android:layout_alignparentstart="true" android:layout_centervertical="true" android:layout_gravity="center_vertical" android:layout_marginleft="5dp" android:layout_weight="1" android:text="服务评价:" android:textsize="18sp" /> <ratingbar android:id="@+id/rb_hotel_evaluate" style="@style/myratingbar" android:layout_width="wrap_content" android:layout_height="20dp" android:layout_torightof="@+id/tv_hotelserver" android:numstars="5" android:rating="0" android:stepsize="1.0" /> </relativelayout> <edittext android:id="@+id/ed_hotelevaluate" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/rl_server" android:background="@drawable/editbox_background_normal" android:singleline="true" /> </linearlayout> </relativelayout>
布局好了,因为activity里面的代码写不是很多,直接上代码了,然后在最后分析一下:
package com.bob.lucking.activity; import android.app.activity; import android.os.bundle; import android.support.annotation.nullable; import android.util.log; import android.view.view; import android.widget.button; import android.widget.edittext; import android.widget.linearlayout; import android.widget.ratingbar; import com.bob.lucking.r; /** * created by bob on 2017/3/20. */ public class dynamicaddviewactivity extends activity implements view.onclicklistener { private string tag = this.getclass().getsimplename(); //装在所有动态添加的item的linearlayout容器 private linearlayout addhotelnameview; @override protected void oncreate(@nullable bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_dynamic); addhotelnameview = (linearlayout) findviewbyid(r.id.ll_addview); findviewbyid(r.id.btn_getdata).setonclicklistener(this); //默认添加一个item addviewitem(null); } @override public void onclick(view v) { switch (v.getid()) { case r.id.btn_addhotel://点击添加按钮就动态添加item addviewitem(v); break; case r.id.btn_getdata://打印数据 printdata(); break; } } /** * item排序 */ private void sorthotelviewitem() { //获取linearlayout里面所有的view for (int i = 0; i < addhotelnameview.getchildcount(); i++) { final view childat = addhotelnameview.getchildat(i); final button btn_remove = (button) childat.findviewbyid(r.id.btn_addhotel); btn_remove.settext("删除"); btn_remove.settag("remove");//设置删除标记 btn_remove.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { //从linearlayout容器中删除当前点击到的viewitem addhotelnameview.removeview(childat); } }); //如果是最后一个viewitem,就设置为添加 if (i == (addhotelnameview.getchildcount() - 1)) { button btn_add = (button) childat.findviewbyid(r.id.btn_addhotel); btn_add.settext("+新增"); btn_add.settag("add"); btn_add.setonclicklistener(this); } } } //添加viewitem private void addviewitem(view view) { if (addhotelnameview.getchildcount() == 0) {//如果一个都没有,就添加一个 view hotelevaluateview = view.inflate(this, r.layout.item_hotel_evaluate, null); button btn_add = (button) hotelevaluateview.findviewbyid(r.id.btn_addhotel); btn_add.settext("+新增"); btn_add.settag("add"); btn_add.setonclicklistener(this); addhotelnameview.addview(hotelevaluateview); //sorthotelviewitem(); } else if (((string) view.gettag()).equals("add")) {//如果有一个以上的item,点击为添加的item则添加 view hotelevaluateview = view.inflate(this, r.layout.item_hotel_evaluate, null); addhotelnameview.addview(hotelevaluateview); sorthotelviewitem(); } //else { // sorthotelviewitem(); //} } //获取所有动态添加的item,找到控件的id,获取数据 private void printdata() { for (int i = 0; i < addhotelnameview.getchildcount(); i++) { view childat = addhotelnameview.getchildat(i); edittext hotelname = (edittext) childat.findviewbyid(r.id.ed_hotelname); ratingbar hotelevaluatestart = (ratingbar) childat.findviewbyid(r.id.rb_hotel_evaluate); edittext hotelevaluate = (edittext) childat.findviewbyid(r.id.ed_hotelevaluate); log.e(tag, "酒店名称:" + hotelname.gettext().tostring() + "-----评价星数:" + (int) hotelevaluatestart.getrating() + "-----服务评价:" + hotelevaluate.gettext().tostring()); } } }
最后我们来解读一下代码:
oncreate里面初始化控件并设置事件,同时我们默认添加一条item,因为addhotelnameview容器初始化时里面没有子view,所以我们默认给添加的方法传null,
在addviewitem方法时,里面有初始化并设置button方法,所以在onclick方法里面把事件的v传入是为了做标记,也就是设置tag,,在添加时会有两种情况:
1.如果只有一条,我们只能显示添加
2.有多条的情况下,如果点击的是设置有tag为add标记的添加,则添加
如果点击删除,在sorthotelviewitem方法里面已经设置过删除点击事件,直接从内存中删除,
最后是获取数据,我们可以通过linearlayout容器来遍历addhotelnameview.getchildcount()获取所有添加的item,然后找到控件的id去获取所有添加的item数据。
再这里注释一下:在addviewitem方法里面看到可以优化,上传资源时已经打包好了,现在在这里用单行注释掉了4行,添加第一个item时不需要排序的,还有就是else里面的是死代码,下载资源的朋友些可以删除这几行。
以上这篇android 动态添加view或item并获取数据的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。