1. 程式人生 > >【Android】_自定義Adapter_學生註冊(無資料庫)

【Android】_自定義Adapter_學生註冊(無資料庫)

本文是完善前一篇學生註冊文章(https://blog.csdn.net/cungudafa/article/details/84780652)中:對`自定義ListView`增加`介面卡Adapter`實現對每個學生個體進行再編輯和刪除操作。

目錄

(一) 自定義Adapter帶圖片用法

Android的listView控制元件非常靈和,可以自定義每一個列表項,實際上每個列表項就是一個View,在Android定義了3個列表控制元件:ListView、ExpandableListView和spinner。

列表的顯示要三個元素:
View: 用來顯示資料的View
介面卡: 用來吧資料對映到View上的中介
資料:具體的要被對映的字串,圖片,或者基本元件。

通過自定義Adapter實現列表中每個item的子控制元件的操作。
第一步自定義一個StuAdapter繼承BaseAdapter,而且為了增加內部控制元件的點選事件,實現一個點選監聽的介面。
自定義的StuAdapter.java
在這裡插入圖片描述

注意
View.OnClickListener與自定義AdapterView.OnItemClickListener, StuAdapter.InnerItemOnClickListener

區別:
1、 View.OnClickListener是對頁面上的點選事件Btn_add事件進行操作:
stu_adapter.xml:
在這裡插入圖片描述
StuAdapeterActivity.java在這裡插入圖片描述
2、 引入的自定義的StuAdapter.InnerItemOnClickListener()是對下圖編輯按鈕和刪除按鈕進行操作
ListView引入的樣式.xml:
在這裡插入圖片描述
StuAdapeterActivity.java
在這裡插入圖片描述

(二) 學生管理系統Demo

效果實現圖:
在這裡插入圖片描述

(三)具體的編碼實現

在這裡插入圖片描述
a)自定義部分:(新建的java和xml樣式)

  1. 先貼出自定義的介面卡StuAdapter.java
package com.example.cungu.myapplication3;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

public class StuAdapter extends BaseAdapter implements View.OnClickListener {
    private List stuDates;///Aadapter的資料來源,
    private Context stuContext;//一個上下文
    private InnerItemOnClickListener innerItemOnClickListener;//自定義的內部點選監聽介面
    //構造方法
    public StuAdapter(Context context,List list){
        this.stuDates=list;
        this.stuContext=context;
    }
    /**
     * 獲得列表項item的個數
     * @return
     */
    @Override
    public int getCount() {
        return stuDates.size();
    }
    /**
     * 根據列表中item的位置獲(i)獲得item的值
     * @param i
     * @return
     */
    @Override
    public Object getItem(int i) {
        return stuDates.get(i);
    }
    /**
     * 根據item的位置i獲得item的id
     * @param i
     * @return
     */
    @Override
    public long getItemId(int i) {
        return i;
    }
    /**
     *
     * @param i
     * @param view
     * @param viewGroup
     * @return
     */
    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {

        //建立一個view物件(item),物件的樣式採用自定義的layout樣式
        View stuView =View.inflate(stuContext,R.layout.myspinner_item,null);
        ///獲得item的每個子元素
        //ImageView iv_userIcon=stuView.findViewById(R.id.userIcon);
        TextView tv_name=stuView.findViewById(R.id.name);
        TextView tv_major=stuView.findViewById(R.id.major);
        ImageView iv_edit=stuView.findViewById(R.id.edit);
        ImageView iv_delete=stuView.findViewById(R.id.delete);
        //將資料來源的一項資料和item的子元素繫結
       // iv_userIcon.setImageResource(R.drawable.qianxi1);
        StuInfo student= (StuInfo) stuDates.get(i);
        tv_name.setText(student.getName());
        tv_major.setText(student.getMajor());
        iv_edit.setImageResource(R.drawable.edit);
        iv_delete.setImageResource(R.drawable.delete);
        //給iv_edit增加一個監聽
        iv_delete.setOnClickListener(this);
        iv_edit.setOnClickListener(this);
        //給刪除和編輯的imageView設定一個標誌,用item的位置i來定位,類似一個id
        iv_delete.setTag(i);
        iv_edit.setTag(i);
        return stuView;
    }
    ///建立一個內部控制元件的監聽介面
    interface  InnerItemOnClickListener{
        abstract void itemClick(View view);
    }
    ///adapter的內部控制元件的監聽事件設定
    public void setOnInnerItemOnClickListener(InnerItemOnClickListener listener){
        //實現此介面的類的物件傳入
        this.innerItemOnClickListener=listener;
    }
    //OnClick()方法,在此方法裡面會呼叫子類重寫的itemClick()方法,
    // 而方法裡的引數view指的就是點選的view。
    // 所以我們只要在重寫的itemClick()方法裡實現點選後的邏輯即可
    @Override
    public void onClick(View view) {
        innerItemOnClickListener.itemClick(view);
    }
}
  1. 自定義學生類StuInfo.java
package com.example.cungu.myapplication3;

import java.io.Serializable;

public class StuInfo implements Serializable {
    private String name;
    private String major;

    public StuInfo(String n, String m)
    {
        name=n;
        major=m;
    }

    public String getMajor() {
        return major;
    }
    public String getName() {
        return name;
    }

    public void setMajor(String major) {
        this.major = major;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  1. 自定義的學生ListView的樣式myspinner_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:text="易烊千璽"
        android:textSize="24sp"
        android:textColor="#404040"/>

    <TextView
        android:id="@+id/major"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/name"
        android:layout_marginLeft="20dp"
        android:text="物聯網工程"
        android:textColor="#003472"
        android:textSize="15sp" />
    <ImageView
        android:id="@+id/edit"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:src="@drawable/edit"
        android:layout_toLeftOf="@+id/delete"
        android:layout_marginRight="5dp"
        />
    <ImageView
        android:id="@+id/delete"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentRight="true"
        android:src="@drawable/delete"
        />
</RelativeLayout>

b)介面設計:(新建的activity介面)

  1. 學生新增介面activity_stu_adapter.xml
    在這裡插入圖片描述
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#f2a98175">
    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="學生列表"
        android:textSize="30sp"
        android:textColor="#ffffff"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="20dp"/>
    <ListView
        android:id="@+id/studentslist"
        android:layout_width="match_parent"
        android:layout_height="400dp"
        android:layout_below="@id/text"
        android:layout_marginTop="5dp"
        >
    </ListView>
    <Button
        android:id="@+id/btn_add"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/studentslist"
        style="?android:attr/borderlessButtonStyle"
        android:text="新增"
        android:textSize="20dp"
        android:textColor="#ffffff"
        android:background="@drawable/shape_button_main"/>

</RelativeLayout>
  1. StuAdapeterActivity.java
package com.example.cungu.myapplication3;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class StuAdapeterActivity extends AppCompatActivity implements View.OnClickListener,AdapterView.OnItemClickListener,
        StuAdapter.InnerItemOnClickListener {

    private ListView studentList;
    private StuAdapter stuAdapater;
    private List<StuInfo> students;
    private Button Btn_add;
    String name,major;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_stu_adapeter);
        studentList=(ListView) findViewById(R.id.studentslist);
        Btn_add=(Button)findViewById(R.id.btn_add);
        Btn_add.setOnClickListener(this);
         /*
          構造一組學生的集合
         */
        students=new ArrayList<>();
      /*  StuInfo s1=new StuInfo("易烊千璽","電子工程");
        StuInfo s2=new StuInfo("王源","物聯網工程");
        StuInfo s3=new StuInfo("王俊凱","電腦科學");
        students.add(s1);
        students.add(s2);
        students.add(s3);
        */
        //獲取傳值
        Bundle bundle = getIntent().getExtras();
        ArrayList<StuInfo> students4=(ArrayList<StuInfo>) bundle.get("students");
        for(StuInfo s:students4){
            name=s.getName();
            major=s.getMajor();
            StuInfo s4=new StuInfo(name,major);
            students.add(s4);
        }
        stuAdapater=new StuAdapter(this,students);
        ///為配置器設定一個自定義的item內部控制元件的點選監聽
        stuAdapater.setOnInnerItemOnClickListener(this);
        ///listview設定介面卡
        studentList.setAdapter(stuAdapater);
        ///LISTVIEW設定選項監聽
        studentList.setOnItemClickListener(this);
    }
    ///列表的每個item的點選事件
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        ListView list = (ListView) adapterView;
        StuInfo s= (StuInfo) list.getItemAtPosition(i);
        Toast.makeText(this, s.getName(),Toast.LENGTH_SHORT).show();
    }
    ///內部控制元件的點選事件方法
    @Override
    public void itemClick(View view) {
        int position= (int) view.getTag();
        switch (view.getId()) {
            case R.id.edit:
                Intent intent=new Intent();
                Toast.makeText(this, "編輯" + name, Toast.LENGTH_SHORT).show();
                intent.putExtra("name", name);
                students.remove(position);
                stuAdapater.notifyDataSetChanged();//介面卡更新資料
                setResult(0, intent);
                finish();
                intent.setClass(this,StuListOperationActivity.class);//新增學生
                startActivity(intent);
                break;
            case R.id.delete:
                students.remove(position);//刪除集合
                stuAdapater.notifyDataSetChanged();//介面卡更新資料
                Toast.makeText(this, "刪除" + position, Toast.LENGTH_SHORT).show();
                break;
        }
    }
    //新增學生btn_add按鈕
    @Override
    public void onClick(View v) {
        Intent intent=new Intent();
        switch (v.getId()) {
            case R.id.btn_add:
                intent.setClass(this, StuListOperationActivity.class);//計算器線性1
                startActivity(intent);
                break;
        }
    }
}
  1. 學生列表介面activity_stu_list_operation.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#f2a98175"
    android:gravity="center"
    android:orientation="vertical">
    <TextView
        android:id="@+id/tv_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="學生新增"
        android:textSize="25dp"
        android:textColor="#ffffff"/>
    <AutoCompleteTextView
        android:id="@+id/name"
        android:layout_width="240dp"
        android:layout_height="42dp"
        android:layout_marginTop="20dp"
        android:background="@drawable/shape_edit"
        android:hint="name" <