1. 程式人生 > >ListView動態建立控制元件、新增資料(單個Activity)

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;

    }

}