【Android】AdapterView與Adapter

一:Adapter:

  1. AdapterView即Adapter(適配器)控件租悄,其內(nèi)容通常是一個(gè)包含多項(xiàng)相同格式資源的列表扁达,每次只顯示其中一項(xiàng)减俏。
  2. 這個(gè)存放Adapter控件內(nèi)容的列表流强,在android被稱為AdapterView(適配器View)
  3. 使用的時(shí)候一般都會先給適配器填充內(nèi)容。然后將已經(jīng)設(shè)定好內(nèi)容的適配器(Adapter)設(shè)置到AdapterView上

Adapter適配器常用的有:ArrayAdapter、SimpleAdapter狠半、以及自定義Adapter

AdapterView適配器View常用的有:ListView可缚、GridView、Spinner惶室。

  1. ArrayAdapter温自、SimpleAdapter、自定義Adapter都繼承自BaseAdapter
  2. BaseAdapter實(shí)現(xiàn)ListAdapter或者SpinnerAdapter接口

1.ArrayAdapter

  1. 最簡單的適配器Adapter皇钞。一般使用在表項(xiàng)中只含有文本信息的情況
  2. 數(shù)據(jù)源包含字符串?dāng)?shù)組悼泌,字符串 List集合。以及string-array
  3. 使用item布局需要是TextView

使用情況:使用在適配每一項(xiàng)都是字符串的情況

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private ListView lv;
    private ArrayAdapter<String> adapter;
    private List<String> list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化適配器View
        lv = findViewById(R.id.lv);
        //數(shù)據(jù)源初始化
        list = new ArrayList<String>();
        for(int i=0;i<40;i++){
            list.add("數(shù)據(jù)"+i);
        }
        //適配器初始化
        //參數(shù)一:使用到的上下文對象   參數(shù)二:使用到的布局文件夹界。給item進(jìn)行使用的    參數(shù)三:數(shù)據(jù)源對象
        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
        //將適配器設(shè)置到listView上
        lv.setAdapter(adapter);
    }
}
  1. 在使用ArrayAdapter的時(shí)候馆里,需要確保當(dāng)前的顯示的item的布局根節(jié)點(diǎn)是TextView。
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:textSize="20sp"
    android:padding="8dp"
    android:gravity="center"
    android:text="顯示內(nèi)容">

</TextView>

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private ListView lv;
    private ArrayAdapter<String> adapter;
//    private ArrayAdapter<CharSequence> adapter1;
    private List<String> list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化適配器View
        lv = findViewById(R.id.lv);
        //數(shù)據(jù)源初始化
        list = new ArrayList<String>();
        for(int i=0;i<40;i++){
            list.add("數(shù)據(jù)"+i);
        }
        //適配器初始化
        //參數(shù)一:使用到的上下文對象   參數(shù)二:使用到的布局文件可柿。給item進(jìn)行使用的    參數(shù)三:數(shù)據(jù)源對象
//        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
        adapter = new ArrayAdapter<String>(this,R.layout.array_adapter_item,list);

        //使用這種方式構(gòu)造的適配器泛型是字符序列
//        adapter1 = ArrayAdapter.createFromResource(this,R.array.list_array,android.R.layout.simple_list_item_1);
        //將適配器設(shè)置到listView上
        lv.setAdapter(adapter);
    }
}

MVC模式:

  1. M:model:數(shù)據(jù)模型——數(shù)據(jù)源鸠踪,V:view:顯示的視圖控件——AdapteView,
    C: controller :控制器——adapter
  2. 特點(diǎn):前端的顯示和后端的數(shù)據(jù)相互分離
  3. 不能使用ListView.add或類似方法添加數(shù)據(jù)复斥,需要通過實(shí)現(xiàn)了ListAdapter接口的Adapter對象加載數(shù)據(jù)营密。
package com.example.adaptertest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private ListView lv;
    private ArrayAdapter<String> adapter;
//    private ArrayAdapter<CharSequence> adapter1;
    private List<String> list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化適配器View
        lv = findViewById(R.id.lv);
        //數(shù)據(jù)源初始化
        list = new ArrayList<String>();
        for(int i=0;i<40;i++){
            list.add("數(shù)據(jù)"+i);
        }
        //適配器初始化
        //參數(shù)一:使用到的上下文對象   參數(shù)二:使用到的布局文件。給item進(jìn)行使用的    參數(shù)三:數(shù)據(jù)源對象
//        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
        adapter = new ArrayAdapter<String>(this,R.layout.array_adapter_item,list);

        //使用這種方式構(gòu)造的適配器泛型是字符序列
//        adapter1 = ArrayAdapter.createFromResource(this,R.array.list_array,android.R.layout.simple_list_item_1);
        //將適配器設(shè)置到listView上
        lv.setAdapter(adapter);
        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            //parent:適配器設(shè)置到的adapterView對象目锭,在這里表示的是ListView(就是代表的是當(dāng)前的ListView對象lv)
            //view:適配器item對應(yīng)的View
            //position:索引位置
            //id:在listView中的item對應(yīng)的id
            //position是從0開始依次向下遞增
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(MainActivity.this,"你點(diǎn)擊了评汰,索引是:"+position+",id:"+id
                ,Toast.LENGTH_SHORT).show();
            }
        });

            //實(shí)現(xiàn)item長按刪除的效果
        lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                //刪除對應(yīng)的item索引
                list.remove(position);
                //如果適配器變化痢虹,需要當(dāng)前的listView也通知到
                adapter.notifyDataSetChanged();
                //當(dāng)為true時(shí)被去,不會去響應(yīng)單擊事件
                return true;
            }
        });
    }
}

2. SimpleAdapter

  1. 比ArrayAdapter復(fù)雜,每一個(gè)列表項(xiàng)中含有不同的子控件
  2. 對比ArrayAdapter
    1.數(shù)據(jù)源可變
    2.可以支持多控件的適配
  3. from和to的表示含義
  4. 數(shù)據(jù)源:List<Map<String,Object>>
  5. 對比ArrayAdapter
    1.比ArrayAdapter支持的item顯示的控件更多
    2.數(shù)據(jù)源的格式變得稍微復(fù)雜一點(diǎn)
  6. 使用:
package com.example.simpleadaptertest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;

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

public class MainActivity extends AppCompatActivity {

    private ListView lv;
    private SimpleAdapter adapter;
    private List<Map<String,Object>> list;
    private Map<String,Object> map;

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

        list = new ArrayList<Map<String, Object>>();
        for(int i=0;i<40;i++){
            map = new HashMap<String, Object>();
            map.put("data","數(shù)據(jù)"+i);
            map.put("intro","介紹"+i);
            list.add(map);
        }
        String[] from = {"data","intro"};
        int[] to = {R.id.data,R.id.intro};
        //參數(shù)一:上下文對象  參數(shù)二:數(shù)據(jù)源List<Map<String,Object>> 參數(shù)三:item對應(yīng)的布局文件
        //參數(shù)四:表示由map中定義的key組成的字符串類型的數(shù)字  參數(shù)五:需要顯示的控件id組成的的數(shù)組
        //保證參數(shù)四和參數(shù)五一一對應(yīng)世分,否則控件屬性會對換(張冠李戴)
        adapter = new SimpleAdapter(this,list,R.layout.simple_adapter_item,from,to);
        //設(shè)置適配器
        lv.setAdapter(adapter);
    }
}
<?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"
    tools:context=".MainActivity">

    <ListView
        android:id="@+id/lv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</RelativeLayout>
<?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="vertical">

    <TextView
        android:id="@+id/data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:padding="5dp"
        android:text="數(shù)據(jù)0"/>

    <TextView
        android:id="@+id/intro"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="28sp"
        android:padding="5dp"
        android:text="介紹"/>
</LinearLayout>

圖文混排

package com.example.simpleadaptertest;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;

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

public class PicActivity extends Activity {
    private ListView lv;
    private SimpleAdapter adapter;
    private int[] images = {R.drawable.bookmark,R.drawable.calendar,R.drawable.lock,R.drawable.print
    ,R.drawable.setup,R.drawable.shield,R.drawable.talk,R.drawable.paper_plane,R.drawable.files_and_folders};
    private String[] names = {"記事本","日歷" ,"鎖","打印機(jī)","設(shè)置","安全管家","微信","文件"};
    private List<Map<String,Object>> list;
    private Map<String,Object> map;

    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        lv = findViewById(R.id.lv);
        //數(shù)據(jù)源進(jìn)行初始化
        list = new ArrayList<Map<String,Object>>();
        for(int i=0;i<names.length;i++){
            map = new HashMap<String, Object>();
            map.put("img",images[i]);//放入的圖片id
            map.put("name",names[i]);//放置上方TextView顯示的內(nèi)容
            map.put("desc","一個(gè)不錯(cuò)的"+names[i]);
            list.add(map);
        }
        //初始化adapter
        String[] from = {"img","name","desc"};
        int[] to = {R.id.pic_image,R.id.pic_name,R.id.pic_desc};
        adapter = new SimpleAdapter(this,list,R.layout.pic_adapter_item,from,to);
        lv.setAdapter(adapter);
    }
}

<?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="match_parent"
    android:padding="4dp">

    <ImageView
        android:id="@+id/pic_image"
        android:layout_width="55dp"
        android:layout_height="72dp"
        android:src="@drawable/bookmark" />

    <TextView
        android:id="@+id/pic_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:layout_toRightOf="@+id/pic_image"
        android:layout_marginLeft="10dp"
        android:text="照相機(jī)"/>

    <TextView
        android:id="@+id/pic_desc"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="16sp"
        android:layout_alignLeft="@+id/pic_name"
        android:layout_alignBottom="@+id/pic_image"
        android:layout_toRightOf="@+id/pic_image"
        android:text="這是一個(gè)不錯(cuò)的相機(jī)" />

</RelativeLayout>
捕獲8.PNG

自定義適配器

  1. 繼承自BaseAdapter编振。實(shí)現(xiàn)里面的四個(gè)方法
    1.int getCount():返回填充的數(shù)據(jù)項(xiàng)個(gè)數(shù),必須為真實(shí)值
    2.Objrct getItem(int position):根據(jù)position返回某一項(xiàng)數(shù)據(jù)
    3.long getItemId(int position):返回某一行的ID
    4.View getView(int position,View convertView,ViewGroup parent):根據(jù)position返回某一項(xiàng)的界面View,顯示給用戶
  2. LayoutInflater:布局映射器
    1.作用:將xml文件轉(zhuǎn)化成View對象
    2.findViewById通過View對象來調(diào)用的
  3. 通過代碼將需要適配的數(shù)目指定踪央,需要返回的view對象指定
  4. 通過from文件獲取布局映射器對象臀玄。就可以調(diào)用該方法的inflate方法將一個(gè)將xml文件轉(zhuǎn)化成View對象
  5. 用法:
package com.example.myadaptertest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private ListView lv;
    private List<String> list;
    private MyAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        lv = findViewById(R.id.lv);
        //數(shù)據(jù)源初始化
        list = new ArrayList<String>();
        for(int i=0;i<40;i++){
            list.add("數(shù)據(jù)源"+i);
        }
        //初始化適配器
        adapter = new MyAdapter();
        lv.setAdapter(adapter);
    }
    //實(shí)現(xiàn)自己的適配器
    class MyAdapter extends BaseAdapter{
        //計(jì)算需要適配的item的總數(shù)
        @Override
        public int getCount() {
            return list.size();
        }
        //獲取每一個(gè)item對象
        @Override
        public String getItem(int position) {
            return list.get(position);
        }
        //獲取每一個(gè)item對象的id
        @Override
        public long getItemId(int position) {
            return position;
        }
        //獲取每一個(gè)item對應(yīng)的View視圖——重要
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            //獲取布局映射器的對象
            LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
            //1.將定義好的xml文件轉(zhuǎn)化成View對象
            View view = inflater.inflate(R.layout.my_adapter_item,null);
            //2.給View對象中的控件進(jìn)行賦值
            TextView tv = view.findViewById(R.id.myadapter_tv);
            //賦值
            tv.setText(getItem(position));
            //或者   tv.setText(list.get(position));
            return view;
        }
    }
}

二:AdapterView:

ListView:滑動(dòng)列表

Spinner:下拉列表

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市畅蹂,隨后出現(xiàn)的幾起案子健无,更是在濱河造成了極大的恐慌,老刑警劉巖液斜,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件累贤,死亡現(xiàn)場離奇詭異,居然都是意外死亡少漆,警方通過查閱死者的電腦和手機(jī)臼膏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來示损,“玉大人渗磅,你說我怎么就攤上這事〖旆茫” “怎么了始鱼?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長脆贵。 經(jīng)常有香客問我医清,道長,這世上最難降的妖魔是什么卖氨? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任会烙,我火速辦了婚禮,結(jié)果婚禮上双泪,老公的妹妹穿的比我還像新娘持搜。我一直安慰自己,他們只是感情好焙矛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布葫盼。 她就那樣靜靜地躺著,像睡著了一般村斟。 火紅的嫁衣襯著肌膚如雪贫导。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天蟆盹,我揣著相機(jī)與錄音孩灯,去河邊找鬼。 笑死逾滥,一個(gè)胖子當(dāng)著我的面吹牛峰档,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼讥巡,長吁一口氣:“原來是場噩夢啊……” “哼掀亩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起欢顷,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤槽棍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后抬驴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體炼七,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年布持,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了豌拙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鳖链,死狀恐怖姆蘸,靈堂內(nèi)的尸體忽然破棺而出墩莫,到底是詐尸還是另有隱情芙委,我是刑警寧澤,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布狂秦,位于F島的核電站灌侣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏裂问。R本人自食惡果不足惜侧啼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望堪簿。 院中可真熱鬧痊乾,春花似錦、人聲如沸椭更。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虑瀑。三九已至湿滓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舌狗,已是汗流浹背叽奥。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留痛侍,地道東北人朝氓。 一個(gè)月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親赵哲。 傳聞我的和親對象是個(gè)殘疾皇子嘹狞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評論 2 354

推薦閱讀更多精彩內(nèi)容