1. 程式人生 > >Android介面卡檢視與介面卡AdapterView & Adapter

Android介面卡檢視與介面卡AdapterView & Adapter

一、介面卡檢視與介面卡AdapterView& Adapter

        介面卡檢視AdapterView繼承自檢視組ViewGroup (一個包含其他子檢視的容器),它是需要介面卡的檢視容器,常用的介面卡檢視有 Spinner、ListView、GridView、Gallery、ViewPager。

        介面卡檢視是一種特殊型別的檢視組。與其他的檢視組型別一樣,介面卡檢視的主要用途是表示一個包含子檢視的檢視。因此,介面卡檢視確定了其子檢視佈局的表現形式。此外,它還在關係中扮演了其他一些特殊角色:介面卡檢視控制螢幕上所顯示的專案數量:這是一個非常關鍵的認識。雖然介面卡對需要顯示的資料繫結檢視的移交進行控制,但卻由介面卡檢視來告訴介面卡應該生成多少檢視。這一點在資料繫結過程中至關重要,因為它可以考慮到各種螢幕大小,同時幫助記憶體管理。後面將介紹更多這方面的內容。

        介面卡檢視包含對專案選擇響應事件,以及請求繫結資料實體的機制:當使用介面卡檢視時,可以根據使用者互動簡單地構建響應佈局。此外,還可以非常容易地訪問相應的資料項,而不必通過極端方法來查詢原始資料項。

        介面卡檢視可以支援使其子檢視具有動畫效果的邏輯:當使用諸如垂直或者水平滾動列表之類的控制元件時,如果可以引入一些平滑的動畫效果那就更好了,這樣可以改善使用者的體驗。可從ViewGroup類中繼承該操作。

        介面卡在檢視與資料之間扮演了一個橋樑的作用,它將資料中的每一項資料轉化為介面卡檢視可以使用的每一個檢視項。

介面卡檢視與介面卡—類圖:

        該圖中,左側類圖是關於介面卡Adapter的,可以看到BaseAdapter抽象類實現了ListAdapter和SpinnerAdapter這兩個介面,在我們自定義的介面卡中,就是要繼承BaseAdapter這個類。右側類圖是關於介面卡檢視AdapterView的,最下面的那四個具體類Spinner、Gallery、ListView、GridView就是常用的介面卡檢視。

下面講解幾個例項,練習使用Spinner和ListView介面卡檢視。

Spinner (下拉列表)有兩種定義方式

  1. 使用靜態資源

                使用資原始檔中的字串陣列,資料是固定的;

                這是最常用、最簡單的方式。

         2.使用介面卡

                使用陣列介面卡(ArrayAdapter),資料長度可變。

二、例項--Spinner使用靜態資源

1.在 strings.xml 中定義字串資料,用作靜態資源。

2.可以在 Java 中使用以下方法獲得資源中的陣列資料

        String[] skills =getResources().getStringArray(R.array.skills);

3.在佈局檔案中,定義Spinner介面卡檢視,並引用字串靜態資源:

4.邏輯部分的實現:

        在主活動Java程式碼中,通過id獲取到XML佈局檔案定義的Spinner介面卡檢視控制元件,並給它設定下拉列表項被選擇監聽事件,spinner.setOnItemSelectedListener(),將使用者選擇的下拉選項,顯示在一個TextView上。

 

三、例項--Spinner使用介面卡

        在主活動.java檔案中,先宣告介面卡檢視Spinner、資料和介面卡,建立好介面卡,並給Spinner設定介面卡,介面卡將檢視和資料一項一項的聯絡起來。上圖可見,資料是一個ArrayList,此次資料是可以變化的,初始化的時候,給它add()了幾個資料,設定該資料可以從網路上獲得。

XML佈局檔案--顯示效果如圖:

實現功能:從下拉列表中,可以刪除選中的項,也可以增加新項。

(1)XML佈局檔案:activity_spinner2.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   
xmlns:tools="http://schemas.android.com/tools"
   
android:layout_width="match_parent"
   
android:layout_height="match_parent"
   
android:paddingLeft="@dimen/activity_horizontal_margin"
   
android:paddingRight="@dimen/activity_horizontal_margin"
   
android:paddingTop="@dimen/activity_vertical_margin"
   
android:paddingBottom="@dimen/activity_vertical_margin"
   
tools:context=".MainActivity"
>

    <TextViewandroid:layout_width="wrap_content"
       
android:layout_height="wrap_content"
       
android:text="專業技能"
       
android:id="@+id/textView"
       
android:layout_alignParentTop="true"
       
android:layout_alignBottom="@+id/spinner"
       
android:gravity="center_vertical"
       
android:layout_marginRight="16dp"
/>

    <Spinner
       
android:layout_width="wrap_content"
       
android:layout_height="wrap_content"
       
android:id="@+id/spinner"
       
android:layout_alignParentTop="true"
       
android:layout_toRightOf="@+id/button_remove"
       
android:layout_toEndOf="@+id/button_remove"
/>

    <Button
       
android:layout_width="wrap_content"
       
android:layout_height="wrap_content"
       
android:text="刪除選中項"
       
android:id="@+id/button_remove"
       
android:layout_below="@+id/spinner"
       
android:onClick="doRemove"
/>

    <EditText
       
android:layout_width="wrap_content"
       
android:layout_height="wrap_content"
       
android:id="@+id/editText"
       
android:singleLine="true"
       
android:hint="已掌握的的技能"
       
android:layout_below="@+id/button_remove"
       
android:layout_toRightOf="@+id/button_add"
       
android:layout_toEndOf="@+id/button_add"
/>

    <Button
       
android:layout_width="wrap_content"
       
android:layout_height="wrap_content"
       
android:text="新增新選項"
       
android:id="@+id/button_add"
       
android:layout_alignBottom="@+id/editText"
       
android:onClick="doAdd"
/>

</RelativeLayout>

(2)活動類檔案Spinner2Activity.java

package com.example.administrator.adapterdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;
import java.util.ArrayList;

/**
 * 使用Spinner介面卡檢視
 * 動態進行資料的處理操作
 */
public class Spinner2Activity extends AppCompatActivity {

    // 檢視
    private Spinner spinner;

    // 資料
    private ArrayList<String> data;

    // 介面卡:檢視與資料之間的橋
    private ArrayAdapter<String> adapter;

    private EditText editText;

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

        spinner = (Spinner) findViewById(R.id.spinner);
        editText = (EditText) findViewById(R.id.editText);

        initView();//初始化
    }

    private void initView() {

        // 初始化資料:可以資料來源或網路獲取
        data = new ArrayList<>();
        data.add("Android");
        data.add("iOS");
        data.add("Java");
        data.add("C++");

        // 引數一:上下文(Context)
        // 引數二:系統中的佈局資源 android.R.layout.simple_spinner_dropdown_item
        // 引數三:資料,可以是字串資料【長度不可變】,也可以是 ArrayList【長度可變】
        adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_dropdown_item, data);

        // 將介面卡設定為檢視
        spinner.setAdapter(adapter);
    }

    /**
     * Spinner 中刪除一項
     *
     * @param v button_remove
     */
    public void doRemove(View v) {

        // 獲得選中項的位置;若無,則返回 -1
        int position = spinner.getSelectedItemPosition();

        if (-1 == position) {
            Toast.makeText(this, "無選中項", Toast.LENGTH_SHORT).show();
        } else {

            // 從資料中刪除當前選中項
            data.remove(position);

            // 介面卡通知【檢視】資料集已改變,檢視會重繪
            adapter.notifyDataSetChanged();
        }
    }

    /**
     * Spinner 中新增一項
     *
     * @param v button_add
     */
    public void doAdd(View v) {
        // 獲得輸入內容
        String input = editText.getText().toString();

        if (input.equals("")) {
            return;       //防止新增空行”
        }

        editText.setText("");

        // 在資料中新增新內容
        data.add(input);

        // 獲得列表的介面卡中資料項的總數
        int size = spinner.getAdapter().getCount();
        //size = data.size();

        // 設定選中選的位置
        spinner.setSelection(size - 1);
    }

}

四、ListView例項

1.ListView列表檢視:

       由多行構成

       每行一個檢視項

       行數由資料決定

       可單選、多選

       是最常用的介面卡檢視

2.ListView設定選擇模式(setChoiceMode)

模式

描述

CHOICE_MODE_NONE

普通模式

CHOICE_MODE_SINGLE

單選模式

CHOICE_MODE_MULTIPLE

多選模式

CHOICE_MODE_MULTIPLE_MODAL

Contextual ActionBar(CAB)

長按進入的多選模式

(暫不使用,具體見選單章節)

效果圖如下:

3.系統佈局模版

系統提供的佈局模版檔案

描述

android.R.layout.simple_list_item_1

包含一個控制元件(TextView)

android.R.id.text1

android.R.layout.simple_list_item_2

包含兩個控制元件(TextView)

android.R.id.text1

android.R.id.text2

android.R.layout.simple_list_item_activated_1

包含一個控制元件,可啟用(高亮顯示)的模版

android.R.layout.simple_list_item_checked

可選擇(單選、多選均可)

android.R.layout.simple_list_item_single_choice

可單選(RadioButton)

android.R.layout.simple_list_item_multiple_choice

可多選(CheckBox)

4.例項功能

(1)實現如圖“聯絡人”顯示。

XML佈局檔案程式碼: activity_list_view2.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ListView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/listView"
        android:layout_alignParentTop="true"
        android:layout_above="@+id/button" />

    <Buttonandroid:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="選中的內容"
        android:id="@+id/button"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:onClick="doClick"/>
</RelativeLayout>

(2)活動類—程式碼:ListView2Activity.java

package com.example.administrator.adapterdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.SparseBooleanArray;
import android.view.View;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.HashMap;

public class ListView2Activity extends AppCompatActivity {

    // 資料的標籤(KEY)
    private static final String KEY_NAME = "name";
    private static final String KEY_PHONE = "phone";

    // 檢視
    private ListView listView;

    // 資料:由鍵值對構成的列表【供簡單介面卡使用】
    private ArrayList<HashMap<String, Object>> data;

    // 介面卡:簡單介面卡【一行可以顯示多個控制元件】
    private SimpleAdapter adapter;

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

        listView = (ListView) findViewById(R.id.listView);

        initView();//初始化
    }

    private void initView() {
        // 初始化資料
        data = new ArrayList<>();
        for (int i = 0; i < 30; i++) {
            HashMap<String, Object> item = new HashMap<String, Object>();
            item.put(KEY_NAME, "聯絡人 " + i);
            item.put(KEY_PHONE, "號碼 " + i);

            data.add(item);
        }

        // 資料的 KEY 構成的陣列
        String[] from = {KEY_NAME, KEY_PHONE};

        // 控制元件的 ID 構成的陣列
        int[] to = {android.R.id.text1, android.R.id.text2};

        // 引數一:上下文
        // 引數二:資料
        // 引數三:系統佈局模版【activated 代表可高亮顯示,2 代表有兩個控制元件】
        // 引數四:資料的 KEY 構成的陣列
        // 引數五:控制元件的 ID 構成的陣列
        adapter = new SimpleAdapter(
                getApplicationContext(),
                data,
                android.R.layout.simple_list_item_activated_2,
                from,
                to);

        // 設定為多選模式
        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

        // 設定介面卡
        listView.setAdapter(adapter);
    }

    /**
     * 顯示選中內容
     *
     * @param v button
     */
    public void doClick(View v) {

        // 獲得選中項的總數
        int count = listView.getCheckedItemCount();

        // 獲得選中項的標識【使用SQLite及遊標時可用】
        long[] ids = listView.getCheckedItemIds();

        // 獲得選中的位置【單選】
        int position = listView.getCheckedItemPosition();

        // 獲得選中的位置【多選,獲得一個稀疏矩陣】
        SparseBooleanArray array = listView.getCheckedItemPositions();

        // 顯示結果
        Toast.makeText(this, array.toString(), Toast.LENGTH_SHORT).show();
    }

}

工程名AdapterDemo,工程下有4個活動(Activity),啟動執行主活動,演示Spinner使用靜態資料;主活動介面下有三個Button,點選可實現向其他活動的跳轉。左下角Button跳轉到Spinner2Activity演示Spinner動態處理資料;中間是演示簡單ListView的使用;右下角跳轉到最後一個ListView的演示。

相關推薦

Android介面卡檢視介面卡AdapterView & Adapter

一、介面卡檢視與介面卡AdapterView& Adapter         介面卡檢視AdapterView繼承自檢視組ViewGroup (一個包含其他子檢視的容器),它是需要介面卡的檢視容器,常用的介面卡檢視有 Spinner、ListView、GridVi

Android 圖片檢視選擇

Android 好用的框架與UI效果demo收集 1.RecyclerViewCardGallery RecyclerView實現迴圈banner,替代ViewPager方案。能夠快速滑動並最終定位到居中位置(相比於原庫支援了迴圈滑動) github https://git

Android中的萬能介面卡——base-adapter-helper解析

在Android開發中,我們經常會用到ListView、GridView,每次編碼的時候都需要為他們寫對應的Adapter,寫多了就感覺很煩躁了,因為基本的程式設計思想都是一樣的,但是每次都要重複去寫,所以我們能不能把它們抽象成一個通用的模板,這樣就不用每次都重複寫相同的程式

Spinner介面卡Adapter使用總結

Spinner的使用離不開和Adapter結合使用,下面將基本的常用法介紹一下,主要還是為初學者提供些幫助 第一步:建立佈局檔案 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andr

Android 泛型ArrayAdapter介面卡 初步入門

在看第一行程式碼時,多次見到介面卡ArrayAdapter(其實也沒幾次),發現這部分知識完全不瞭解,就去了解一下,特此整理如下。 一 Java泛型 1.泛型簡介 java 泛型(generics)是 JDK 5 中引入的一個新特性, 泛型提供了編譯時型別安全檢測機制,

Java IO框架介面卡模式、裝飾器模式

IO框架: 介面卡模式: 介面卡模式(Adapter Pattern)是作為兩個不相容的介面之間的橋樑。這種型別的設計模式屬於結構型模式,它結合了兩個獨立介面的功能。 這種模式涉及到一個單一的類,該類負責加入獨立的或不相容的介面功能。舉個真實的例子,讀卡器是作為記憶體卡和筆

Swift 中的設計模式 #3 外觀模式介面卡模式

作者:Andrew Jaffee,原文連結,原文日期:2018-09-04 譯者:鄭一一;校對:BigNerdCoding,pmst,Forelax;定稿:Forelax 本文是我的設計模式系列教程的第三篇。在第一篇文章中,我介紹了 建立型模式中的工廠模式和單例模式。在第二篇文章中,又討論了一下

Java Adapter 介面卡模式(類介面卡,物件介面卡)優缺點對比

介面卡模式就是把一個類的介面轉換成客戶端所期待的另外一種介面,從而使原介面不匹配而無法在一起工作的的兩個類能在一起工作。從功能上說,這些介面不相容的類一般具有相同或相似的功能。通常我們通過修改該類的介面來解決這種介面不相容的情形,但是如果我們不願意為了一個應用而修改各原介面,或者我們壓根兒就沒有物件

Android AndroidStudio檢視debug keyrelease key

檢視debug key 找到AS左側的gradle,找到root下面的Task點開,找到android點開,雙擊signingReport 執行如下,並點選下圖標出來的按鈕,會看到執行結果

使用Activity和Delegate介面卡互動

在這個Demo裡,我們會分析如何通過委託模式(Delegation Pattern)幫助開發者把所有的業務邏輯從介面卡中移到Activity中。我們建立一個簡單的應用程式,通過該應用程式可以向列表中新增電話號碼,列表中每一行都有一個Remove按鈕,用於刪除電話

HeadFirst 設計模式筆記(七)—— 介面卡模式外觀模式

介面卡模式(Adapter):可以想想現實生活中的轉換插頭。介面卡是一箇中間層,能將類的介面轉換成想要的介面。這與前文中的裝飾者模式有點像,不過裝飾者模式是賦予介面新的功能,而介面卡模式則把介面轉換成需要的樣子。 我的理解比較簡單:假設我們手頭有兩個介面A和B。有一個

eclipse android或者Java應用檢視jdk路徑和版本android studio檢視jdk版本

elipse IDE環境下jdk配置: eclipse -.> window ->preferences ->java -> Installed JRES 對於android工程安裝jre/jdk最高版,但是不一定使用最高版本,而是可以配置jdk版本

裝飾者模式,代理模式介面卡模式的比較

裝飾者與適配者模式的區別 1.關於新職責:介面卡也可以在轉換時增加新的職責,但主要目的不在此。裝飾者模式主要是給被裝飾者增加新職責的。 2.關於原介面:介面卡模式是用新介面來呼叫原介面,原介面對新系統是不可見或者說不可用的。裝飾者模式原封不動的使用原介面,系統對裝飾的物件也通過原介面來完成使用。(增加新介

EventBus介面卡

EventBus匯入依賴:compile 'org.greenrobot:eventbus:3.0.0' //註冊EventBus public View onCreateView(LayoutInflater inflater, @Nullable ViewGrou

Android檢視繪製事件分發流程(底層)

    本文我們來簡單的分析下Activity的SetContentView方法底層是如何對我們的layout.xml檔案進行處理,然後分析一下事件是如何從WindowManagerService中傳遞到View的dispatchTouchEvent方法中的,最後會

設計模式-門面模式介面卡模式

//門面模式 var DED = window.DED || {} DED.util = { stopPropagation:function(e){ if(e.stopPropagation){ //w3 interface e.stopPropagat

Android中Listview通過介面卡設定Item的高度及其他樣式

一、前提:需要通過介面卡設定ListView的相關樣式,並定義一個輔助檔案listviewitemstyle.xml: 以下為java中相關程式碼: listView = (ListView)findViewById(R.id.lstvSubj); //result即要載入

JavaEE_Mybatis_SpringMVC_Spring_lesson3_註解處理器對映器介面卡以及處理器(Controller)

註解的處理器對映器相比與非註解的處理器對映器的優勢 :可以在一個類中寫多個RequestMapping("url")的格式,不需要以實現介面的形式進行開發, 註解:可以在一個類中完成多個action, 非註解:實現介面,一個類中只能寫一個action 另外:註解的處理器

C++的多型介面卡模式

       原創文章,轉載請註明出處,謝謝!               作者:清林,部落格名:飛空靜渡 我們知道,c++的多型可以為不同的實現提供同一個介面,介面卡模式也可以讓同一介面得到不同的實現。下面我們通過一個例子來說明這兩個東東 :) 假設,我要設計一套對磁

設計模式-策略模式介面卡模式

某移動支付系統(PaySystem)在實現賬戶資金轉入和轉出時需進行身份驗證,該系統為使用者提供了多種身份驗證方式,例如密碼驗證(PasswordValidator)、指紋驗證(FingerprintV