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里面的是死代码,下载资源的朋友些可以删除这几行。

需要源码的点击这里直接下载

  • 17
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
对于动态加载数据,可以使用ListView或RecyclerView这样的组件,通过Adapter来实现数据动态添加和展示。下面是一个使用RecyclerView的示例代码: 1. 在布局文件中添加RecyclerView组件: ``` <androidx.recyclerview.widget.RecyclerView android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 2. 在Activity或Fragment中初始化RecyclerView,并设置Adapter: ``` // 获取RecyclerView组件 RecyclerView recyclerView = findViewById(R.id.recycler_view); // 设置RecyclerView的LayoutManager recyclerView.setLayoutManager(new LinearLayoutManager(this)); // 创建Adapter并设置给RecyclerView MyAdapter adapter = new MyAdapter(dataList); recyclerView.setAdapter(adapter); ``` 3. 自定义Adapter类,根据数据动态添加item: ``` public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<String> mDataList; public MyAdapter(List<String> dataList) { mDataList = dataList; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { // 创建ViewHolder View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { // 绑定数据 String data = mDataList.get(position); holder.textView.setText(data); } @Override public int getItemCount() { // 返回数据项数 return mDataList.size(); } public void addItem(String data) { // 添加数据项 mDataList.add(data); // 更新UI notifyItemInserted(mDataList.size() - 1); } static class ViewHolder extends RecyclerView.ViewHolder { TextView textView; public ViewHolder(@NonNull View itemView) { super(itemView); textView = itemView.findViewById(R.id.text_view); } } } ``` 对于动态添加TableLayout数据,同样可以使用Java代码来实现。下面是一个示例代码: ``` // 获取TableLayout组件 TableLayout tableLayout = findViewById(R.id.table_layout); // 创建一个新行 TableRow tableRow = new TableRow(this); // 添加TextView到新行中 TextView textView = new TextView(this); textView.setText("测试数据"); tableRow.addView(textView); // 把新行添加到TableLayout中 tableLayout.addView(tableRow); ``` 在上面的代码中,我们首先获取了TableLayout组件,然后创建一个新的TableRow对象,再向其中添加一个TextView对象,最后把新的TableRow添加到TableLayout中即可。如果需要添加更多的数据,只需要重复以上步骤即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值