ListView動態建立控制元件、新增資料(單個Activity)
阿新 • • 發佈:2019-02-06
因為專案需要這個功能,所以先寫了個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;
}
}