?1.概念
Adapter英文意思 適配器
?
Adapter是連接后端數據和前端顯示的適配器接口,是數據和UI(View)之間一個重要的紐帶。在常見的View(ListView,GridView)等地方都需要用到Adapter。如下圖直觀的表達了Data、Adapter、View三者的關系:
我們可以看到在Android中與Adapter有關的所有接口、類的完整層級圖。在我們使用過程中可以根據自己的需求實現接口或者繼承類進行一定的擴展。比較常用的有 BaseAdapter,ArrayAdapter,SimpleCursorAdapter等。
- BaseAdapter 是一個抽象類,繼承它需要實現較多的方法,所以也就具有較高的靈活性;
- ArrayAdapter 支持泛型操作,通常需要實現getView方法,特殊情況下(結合數據row id),為了讓ui事件相應處理方便點最好重寫getItemId;
- SimpleCursorAdapter 可以適用于簡單的純文字型ListView,它需要Cursor的字段和UI的id對應起來。如需要實現更復雜的UI也可以重寫其他方法。
?
?
BaseAdapter的所有接口:
最常用的有
getView()
,它是將獲取數據后的View組件返回,如ListView中每一行里的TextView、Gallery中的每個ImageView。
getItemId() ,返回數據的id
getItem() ,將獲取數據的某個位置的數據返回 如array[0],array[1].....
getCount() 將獲取數據的個數返回
?
BaseAdapter 是一個 抽象類 如果使用我們必須自己去實現
下邊引用一個例子:
?我用了4個插件Spinner,ListView ,Gallery,GridView
?
?
package com.example.fouradpater_2; import android.os.Bundle; import android.provider.MediaStore.Images; import android.app.Activity; import android.content.Context; import android.view.LayoutInflater; import android.view.Menu; import android.view.View; import android.view.ViewGroup; import android.widget.Adapter; import android.widget.BaseAdapter; import android.widget.Gallery; import android.widget.GridView; import android.widget.ImageView; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.Spinner; import android.widget.SpinnerAdapter; import android.widget.TextView; public class MainActivity extends Activity { //作為一個adapter用于轉換的“過渡”view private LayoutInflater mInflater; //定義一個數組用來存放數據 private static final String[] mad = {"4","3","2","1"}; //定義四個插件 private Spinner mSpinner; private GridView mGridView; private Gallery mGallery; private ListView mListView; //定義一個adapter private Adapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); // mInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); // mInflater = (LayoutInflater)MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); //關聯四個組件 mSpinner = (Spinner) findViewById(R.id.spinner1); mGridView = (GridView) findViewById(R.id.gridView1); mGallery = (Gallery) findViewById(R.id.gallery1); mListView = (ListView) findViewById(R.id.listView1); //new一個 Adapter 的 BaseAdapter mAdapter = new BaseAdapter() { @Override //最常用的有getView(),它是將獲取數據后的View組件返回, //如ListView中每一行里的TextView、Gallery中的每個ImageView。 public View getView(int position, View convertView, ViewGroup parent) { // TODO Auto-generated method stu TextView text; ImageView imgview; RelativeLayout rLayout; if (convertView == null) { rLayout = (RelativeLayout) mInflater.inflate(R.layout.new_file, parent, false); // view = new TextView(MainActivity.this); } else { rLayout = (RelativeLayout) convertView; } String item = (String) getItem(position); // rLayout.setTag(item.toString()); text = (TextView) rLayout.findViewById(R.id.TextView2); // text.setText(item.toString()); 畫蛇添足 text.setText(item); imgview = (ImageView) rLayout.findViewById(R.id.ImageView1); // imgview.setId(R.drawable.ic_launcher);// 用錯函數 imgview.setImageResource(R.drawable.ic_launcher); return rLayout; } @Override //getItemId(),返回數據的id public long getItemId(int position) { return position; } @Override //getItem(),將獲取數據的某個位置的數據返回 如array[0],array[1]..... public Object getItem(int position) { return mad[mad.length-1-position]; } @Override //getCount()將獲取數據的個數返回 public int getCount() { return mad.length; } }; mSpinner.setAdapter((SpinnerAdapter) mAdapter); mGridView.setAdapter((ListAdapter) mAdapter); mGallery.setAdapter((SpinnerAdapter) mAdapter); mListView.setAdapter((ListAdapter) mAdapter); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
?
記錄下自己的錯誤,順便做下記錄和介紹
使用BaseAdapter ,必須將最基礎的4個函數完善
<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"> <ImageView android:id="@+id/ImageView1" android:layout_width="20dp" android:layout_height="20dp" /> <TextView android:id="@+id/TextView2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toRightOf="@+id/ImageView1" /> </RelativeLayout>
?這是BaseAdapter需要用到的xml,算是一個“過渡”的xml,用來給getView傳遞View
?
?
所以BaseAdapter比較萬能,可以將各種儲存結構通過Adapter 傳遞給需要的View
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
