ListView动态创建控件、添加数据(单个Activity)

因为项目需要这个功能,所以先写了个Demo测试一下,Java学了半吊子然后直接上Android做项目,各位大神可以提出点意见,小弟虚心接纳。

这里的删除按钮还没实现功能,时间不够了得回宿舍睡觉了,不想熬夜太难受。

先上效果图:



下面说实现的大体思路:

1、首先在 MainActivity.java 中初始化一个EditText用于输入数据、两个Button用于点击添加、一个ListView用于存放每个输入的数据(ListView下有两个TextView作为一组Item)、Adapter用于显示ListView中的item、List<bean>集合存放每次创建出来的item实体。

2、mAdapter在构造方法中与MainActivity绑定,并传入List<bean>进行设置item显示的数量、外观,用ViewHolder进行bean.xml中控件的初始化。

3、bean.java中设置set和get方法,构造函数方便new出来的时候直接输入数据,方便动态创建控件。

下面贴上代码:

首先是布局文件:

1、activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <EditText
            android:id="@+id/id_ed_data"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1" />

        <Button
            android:id="@+id/id_btn_add"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="添加" />

        <Button
            android:id="@+id/id_btn_reduce"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="删除" />
    </LinearLayout>

    <ListView
        android:id="@+id/id_listview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </ListView>

</LinearLayout>

2、bean.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <TextView
        android:text="左边"
        android:id="@+id/id_left"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:layout_width="0dp"/>
    <TextView
        android:text="右边"
        android:id="@+id/id_right"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>
</LinearLayout>

下面是java文件:

1、MainActivity.java

package com.example.administrator.datademo.activity;


import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

import com.example.administrator.datademo.R;
import com.example.administrator.datademo.adapter.mAdapter;
import com.example.administrator.datademo.data.bean;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    public static String TAG = "MainActivity";
    private Button btn_add;
    private Button btn_reduce;
    private EditText ed;
    private ListView mlistview;
    private List<bean> mlist = new ArrayList<bean>();
    public mAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //初始化视图
        initView();

    }


    private void initView() {

        //初始化获取控件
        btn_add = (Button) findViewById(R.id.id_btn_add);
        btn_reduce = (Button) findViewById(R.id.id_btn_reduce);
        ed = (EditText) findViewById(R.id.id_ed_data);
        mlistview = (ListView) findViewById(R.id.id_listview);

        //创建ListView的适配器adapter
        adapter = new mAdapter(MainActivity.this, mlist);
        //设置ListView的适配器
        mlistview.setAdapter(adapter);

        //设置监听事件
        btn_add.setOnClickListener(this);
        btn_reduce.setOnClickListener(this);
    }


    /**
     * 用switch case来伺服监听按钮点击事件
     * @param view
     */
    @Override
    public void onClick(View view) {

        switch (view.getId()) {
            //点击添加按钮
            case R.id.id_btn_add:

                //ListView动态添加控件(两个TextView)
                mlist.add(new bean(new TextView(MainActivity.this), new TextView(MainActivity.this)));

                //用for循环进行遍历添加数据,用Iterator遍历也行
                for (int i = 0; i < mlist.size(); i++) {
                    mlist.get(i).getTv1().setText(ed.getText());
                    mlist.get(i).getTv2().setText(ed.getText());
                }

                if (mlist.size() > 0)
                    Log.e(TAG, "动态添加数据成功");

                break;
            case R.id.id_btn_reduce:
                //没有实现功能
                break;
        }
    }

}

2、bean.java

package com.example.administrator.datademo.data;

import android.widget.TextView;

/**
 * 用于动态创建和添加数据 那两个TextView为一组的Item
 * Created by Administrator on 2018/3/20.
 */

public class bean {
    private TextView tv1;
    private TextView tv2;

    public TextView getTv1() {
        return tv1;
    }

    public bean(TextView tv1, TextView tv2) {
        this.tv1 = tv1;
        this.tv2 = tv2;
    }

    public void setTv1(TextView tv1) {

        this.tv1 = tv1;
    }

    public TextView getTv2() {
        return tv2;
    }

    public void setTv2(TextView tv2) {
        this.tv2 = tv2;
    }

}

3、mAdapter.java

package com.example.administrator.datademo.adapter;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.TextView;
import com.example.administrator.datademo.R;
import com.example.administrator.datademo.data.bean;

import java.util.List;


/**
 * Created by Administrator on 2018/3/20.
 */

public class mAdapter extends BaseAdapter {


    public static String TAG = "mAdapter";
    public List<bean> mList;
    public Context mContext;
    public LayoutInflater layoutInflater;
    public View view1;
    public EditText ed;

    public mAdapter(Context context, List<bean> list) {
        this.mContext = context;
        this.mList = list;
        layoutInflater = LayoutInflater.from(context);
    }

    /**
     * getCount()方法
     * 就是item的数量
     * return 多少显示几个item
     * @return
     */
    @Override
    public int getCount() {
        Log.e(TAG, "Item数量 " + mList.size());
        return mList.size();
    }

    /**
     * 根据下标i获得Item
     * @param i
     * @return
     */
    @Override
    public Object getItem(int i) {

        return mList.get(i);
    }

    @Override
    public long getItemId(int i) {
        Log.e(TAG, "getItemId " + i);
        return i;
    }


    /**
     * 绘制这个ListView
     * @param i
     * @param view
     * @param viewGroup
     * @return
     */
    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {

        Log.e(TAG, "这个getView的 i = " + i);

        ViewHolder holder;

        if (view == null) {
            //用layoutInflater.inflate获取到bean.xml
            //接下来就能使用这个布局里面的控件了
            view = layoutInflater.inflate(R.layout.bean, null, true);
            holder = new ViewHolder();
            holder.textView1 = view.findViewById(R.id.id_left);
            holder.textView2 = view.findViewById(R.id.id_right);
            view.setTag(holder);

            //设置两个TextView获取List集合里new好的控件和得到里面的数据
            //这个数据在MainActivity.java的onClick里通过EditText获得
            holder.textView1.setText(mList.get(i).getTv1().getText());
            holder.textView2.setText(mList.get(i).getTv1().getText());

            //刷新这个ListView
            notifyDataSetChanged();

        } else {
            holder = (ViewHolder) view.getTag();
        }

        return view;
    }

    static class ViewHolder {

        TextView textView1;
        TextView textView2;

    }

}





评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值