1. 程式人生 > 實用技巧 >吳裕雄--天生自然ANDROID開發學習:2.4.4 Adapter基礎講解

吳裕雄--天生自然ANDROID開發學習:2.4.4 Adapter基礎講解

1.MVC模式的簡單理解
舉個例子:大型的商業程式通常由多人一同開發完成,比如有人負責操作介面的規劃與設計, 有人負責程式程式碼的編寫如果要能夠做到程式專案的分工就必須在程式的結構上做適合的安排 ,如果,介面設計與修改都涉及到程式程式碼的改變的話,那麼兩者的分工就會造成執行上的困難 良好的程式架構師將整個程式專案劃分為如圖的三個部分:

關係圖解析:

Model:通常可以理解為資料,負責執行程式的核心運算與判斷邏輯,,通過view獲得使用者 輸入的資料,然後根據從資料庫查詢相關的資訊,最後進行運算和判斷,再將得到的結果交給view來顯示
view:使用者的操作介面,說白了就是GUI,應該使用哪種介面元件,元件間的排列位置與順序都需要設計
Controller:控制器,作為model與view之間的樞紐,負責控制程式的執行流程以及物件之間的一個互動
而這個Adapter則是中間的這個Controller的部分: Model(資料) ---> Controller(以什麼方式顯示到)---> View(使用者介面) 這就是簡單MVC元件的簡單理解!

2.Adapter概念解析
官方文件:Adapter:http://androiddoc.qiniudn.com/reference/android/widget/Adapter.html

上面就是Adapter以及繼承結構圖了,接著我們介紹一下實際開發中還用到的幾個Adapter吧!

BaseAdapter:抽象類,實際開發中我們會繼承這個類並且重寫相關方法,用得最多的一個Adapter!
ArrayAdapter:支援泛型操作,最簡單的一個Adapter,只能展現一行文字~
SimpleAdapter:同樣具有良好擴充套件性的一個Adapter,可以自定義多種效果!
SimpleCursorAdapter:用於顯示簡單文字型別的listView,一般在資料庫那裡會用到,不過有點過時, 不推薦使用!

程式碼實現:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //要顯示的資料
        String[] strs = {"基神","B神","翔神","曹神","J神"};
        //建立ArrayAdapter
        ArrayAdapter<String> adapter = new ArrayAdapter<String>
                (this,android.R.layout.simple_expandable_list_item_1,strs);
        //獲取ListView物件,通過呼叫setAdapter方法為ListView設定Adapter設定介面卡
        ListView list_test = (ListView) findViewById(R.id.list_test);
        list_test.setAdapter(adapter);
    }
}
一些相關的東西:

1.除了通過陣列外,我們還可以寫到一個數組資原始檔中:

比如:在res\valuse下建立一個數組資源的xml檔案:arrays.xml:

<?xml version="1.0" encoding="utf-8"?>  
<resources>  
    <string-array name="myarray">  
    <item>語文</item>  
    <item>數學</item>  
    <item>英語</item>  
    </string-array>      
</resources>
接著佈局的listview屬性設定下這個列表項:

<ListView  
        android:id="@id/list_test"  
        android:layout_height="match_parent"  
        android:layout_width="match_parent"   
        android:entries="@array/myarray"/>
也可以在Java程式碼中這樣寫:

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
        R.array.myarray,android.R.layout.simple_list_item_multiple_choice );
同樣也是可以的!

2.一開始也說了這個ArrayAdapter支援泛型,比如,這樣寫:

List<String> data = new ArrayList<String>();
data.add("基神");
data.add("B神");
ArrayAdapter<String> adapter = new ArrayAdapter<String>
                (this,android.R.layout.simple_expandable_list_item_1,data);
3.我們看到了在例項化ArrayAdapter的第二個引數: android.R.layout.simple_expandable_list_item_1 其實這些是系統給我們提供好的一些ListView模板,有下面幾種:

程式碼實現:

先來編寫一個列表專案每一項的佈局:

list_item.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:orientation="horizontal">

    <!-- 定義一個用於顯示頭像的ImageView -->
    <ImageView
        android:id="@+id/imgtou"
        android:layout_width="64dp"
        android:layout_height="64dp"
        android:baselineAlignBottom="true"
        android:paddingLeft="8dp" />

    <!-- 定義一個豎直方向的LinearLayout,把QQ呢稱與說說的文字框設定出來 -->
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="8dp"
            android:textColor="#1D1D1C"
            android:textSize="20sp" />

        <TextView
            android:id="@+id/says"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingLeft="8px"
            android:textColor="#B4B4B9"
            android:textSize="14sp" />

    </LinearLayout>

</LinearLayout>
接下來是MainActivity.java:

public class MainActivity extends AppCompatActivity {

    private String[] names = new String[]{"B神", "基神", "曹神"};
    private String[] says = new String[]{"無形被黑,最為致命", "大神好厲害~", "我將帶頭日狗~"};
    private int[] imgIds = new int[]{R.mipmap.head_icon1, R.mipmap.head_icon2, R.mipmap.head_icon3};

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

        List<Map<String, Object>> listitem = new ArrayList<Map<String, Object>>();
        for (int i = 0; i < names.length; i++) {
            Map<String, Object> showitem = new HashMap<String, Object>();
            showitem.put("touxiang", imgIds[i]);
            showitem.put("name", names[i]);
            showitem.put("says", says[i]);
            listitem.add(showitem);
        }

        //建立一個simpleAdapter
        SimpleAdapter myAdapter = new SimpleAdapter(getApplicationContext(), listitem, R.layout.list_item, new String[]{"touxiang", "name", "says"}, new int[]{R.id.imgtou, R.id.name, R.id.says});
        ListView listView = (ListView) findViewById(R.id.list_test);
        listView.setAdapter(myAdapter);
    }
}
3)SimpleCursorAdapter使用示例:

程式碼實現:

先寫下listView每個item的佈局:

list_item.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:orientation="horizontal">


    <TextView
        android:id="@+id/list_name"
        android:layout_width="0dp"
        android:layout_height="64dp"
        android:layout_weight="1"
        android:gravity="center"
        android:text="小豬"
        android:textColor="#0000FF"
        android:textSize="18sp" />

    <TextView
        android:id="@+id/list_phone"
        android:layout_width="0dp"
        android:layout_height="64dp"
        android:layout_weight="1"
        android:gravity="center"
        android:text="13798989898"
        android:textColor="#EA5C4D"
        android:textSize="18sp" />


</LinearLayout>
接著activity_main佈局和前面的一樣,就是簡單的ListView,然後是

MainActivity.java:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView list_test = (ListView) findViewById(R.id.list_test);
        //讀取聯絡人
        Cursor cursor = getContentResolver()
                .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
        SimpleCursorAdapter spcAdapter = new SimpleCursorAdapter(this,R.layout.list_item,cursor,
                new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER},
                new int[]{R.id.list_name,R.id.list_phone});
        list_test.setAdapter(spcAdapter);
    }
}
最後AndroidManifest.xml里加個讀聯絡人的許可權就可以了!

<uses-permission android:name="android.permission.READ_CONTACTS"/>