【Android】AdapterView與Adapter

一:Adapter:

  1. AdapterView即Adapter(適配器)控件,其內容通常是一個包含多項相同格式資源的列表,每次只顯示其中一項。
  2. 這個存放Adapter控件內容的列表,在android被稱為AdapterView(適配器View)
  3. 使用的時候一般都會先給適配器填充內容。然后將已經設定好內容的適配器(Adapter)設置到AdapterView上

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

AdapterView適配器View常用的有:ListView、GridView、Spinner。

  1. ArrayAdapter、SimpleAdapter、自定義Adapter都繼承自BaseAdapter
  2. BaseAdapter實現ListAdapter或者SpinnerAdapter接口

1.ArrayAdapter

  1. 最簡單的適配器Adapter。一般使用在表項中只含有文本信息的情況
  2. 數據源包含字符串數組,字符串 List集合。以及string-array
  3. 使用item布局需要是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 List<String> list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化適配器View
        lv = findViewById(R.id.lv);
        //數據源初始化
        list = new ArrayList<String>();
        for(int i=0;i<40;i++){
            list.add("數據"+i);
        }
        //適配器初始化
        //參數一:使用到的上下文對象   參數二:使用到的布局文件。給item進行使用的    參數三:數據源對象
        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
        //將適配器設置到listView上
        lv.setAdapter(adapter);
    }
}
  1. 在使用ArrayAdapter的時候,需要確保當前的顯示的item的布局根節點是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="顯示內容">

</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);
        //數據源初始化
        list = new ArrayList<String>();
        for(int i=0;i<40;i++){
            list.add("數據"+i);
        }
        //適配器初始化
        //參數一:使用到的上下文對象   參數二:使用到的布局文件。給item進行使用的    參數三:數據源對象
//        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
        adapter = new ArrayAdapter<String>(this,R.layout.array_adapter_item,list);

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

MVC模式:

  1. M:model:數據模型——數據源,V:view:顯示的視圖控件——AdapteView,
    C: controller :控制器——adapter
  2. 特點:前端的顯示和后端的數據相互分離
  3. 不能使用ListView.add或類似方法添加數據,需要通過實現了ListAdapter接口的Adapter對象加載數據。
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);
        //數據源初始化
        list = new ArrayList<String>();
        for(int i=0;i<40;i++){
            list.add("數據"+i);
        }
        //適配器初始化
        //參數一:使用到的上下文對象   參數二:使用到的布局文件。給item進行使用的    參數三:數據源對象
//        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,list);
        adapter = new ArrayAdapter<String>(this,R.layout.array_adapter_item,list);

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

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

2. SimpleAdapter

  1. 比ArrayAdapter復雜,每一個列表項中含有不同的子控件
  2. 對比ArrayAdapter
    1.數據源可變
    2.可以支持多控件的適配
  3. from和to的表示含義
  4. 數據源:List<Map<String,Object>>
  5. 對比ArrayAdapter
    1.比ArrayAdapter支持的item顯示的控件更多
    2.數據源的格式變得稍微復雜一點
  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","數據"+i);
            map.put("intro","介紹"+i);
            list.add(map);
        }
        String[] from = {"data","intro"};
        int[] to = {R.id.data,R.id.intro};
        //參數一:上下文對象  參數二:數據源List<Map<String,Object>> 參數三:item對應的布局文件
        //參數四:表示由map中定義的key組成的字符串類型的數字  參數五:需要顯示的控件id組成的的數組
        //保證參數四和參數五一一對應,否則控件屬性會對換(張冠李戴)
        adapter = new SimpleAdapter(this,list,R.layout.simple_adapter_item,from,to);
        //設置適配器
        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="數據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 = {"記事本","日歷" ,"鎖","打印機","設置","安全管家","微信","文件"};
    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);
        //數據源進行初始化
        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顯示的內容
            map.put("desc","一個不錯的"+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="照相機"/>

    <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="這是一個不錯的相機" />

</RelativeLayout>
捕獲8.PNG

自定義適配器

  1. 繼承自BaseAdapter。實現里面的四個方法
    1.int getCount():返回填充的數據項個數,必須為真實值
    2.Objrct getItem(int position):根據position返回某一項數據
    3.long getItemId(int position):返回某一行的ID
    4.View getView(int position,View convertView,ViewGroup parent):根據position返回某一項的界面View,顯示給用戶
  2. LayoutInflater:布局映射器
    1.作用:將xml文件轉化成View對象
    2.findViewById通過View對象來調用的
  3. 通過代碼將需要適配的數目指定,需要返回的view對象指定
  4. 通過from文件獲取布局映射器對象。就可以調用該方法的inflate方法將一個將xml文件轉化成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);
        //數據源初始化
        list = new ArrayList<String>();
        for(int i=0;i<40;i++){
            list.add("數據源"+i);
        }
        //初始化適配器
        adapter = new MyAdapter();
        lv.setAdapter(adapter);
    }
    //實現自己的適配器
    class MyAdapter extends BaseAdapter{
        //計算需要適配的item的總數
        @Override
        public int getCount() {
            return list.size();
        }
        //獲取每一個item對象
        @Override
        public String getItem(int position) {
            return list.get(position);
        }
        //獲取每一個item對象的id
        @Override
        public long getItemId(int position) {
            return position;
        }
        //獲取每一個item對應的View視圖——重要
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            //獲取布局映射器的對象
            LayoutInflater inflater = LayoutInflater.from(MainActivity.this);
            //1.將定義好的xml文件轉化成View對象
            View view = inflater.inflate(R.layout.my_adapter_item,null);
            //2.給View對象中的控件進行賦值
            TextView tv = view.findViewById(R.id.myadapter_tv);
            //賦值
            tv.setText(getItem(position));
            //或者   tv.setText(list.get(position));
            return view;
        }
    }
}

二:AdapterView:

ListView:滑動列表

Spinner:下拉列表

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容