一:Adapter:
- AdapterView即Adapter(適配器)控件租悄,其內(nèi)容通常是一個(gè)包含多項(xiàng)相同格式資源的列表扁达,每次只顯示其中一項(xiàng)减俏。
- 這個(gè)存放Adapter控件內(nèi)容的列表流强,在android被稱為AdapterView(適配器View)
- 使用的時(shí)候一般都會先給適配器填充內(nèi)容。然后將已經(jīng)設(shè)定好內(nèi)容的適配器(Adapter)設(shè)置到AdapterView上
Adapter適配器常用的有:ArrayAdapter、SimpleAdapter狠半、以及自定義Adapter
AdapterView適配器View常用的有:ListView可缚、GridView、Spinner惶室。
- ArrayAdapter温自、SimpleAdapter、自定義Adapter都繼承自BaseAdapter
- BaseAdapter實(shí)現(xiàn)ListAdapter或者SpinnerAdapter接口
1.ArrayAdapter
- 最簡單的適配器Adapter皇钞。一般使用在表項(xiàng)中只含有文本信息的情況
- 數(shù)據(jù)源包含字符串?dāng)?shù)組悼泌,字符串 List集合。以及string-array
- 使用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);
}
}
- 在使用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模式:
- M:model:數(shù)據(jù)模型——數(shù)據(jù)源鸠踪,V:view:顯示的視圖控件——AdapteView,
C: controller :控制器——adapter
- 特點(diǎn):前端的顯示和后端的數(shù)據(jù)相互分離
- 不能使用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
- 比ArrayAdapter復(fù)雜,每一個(gè)列表項(xiàng)中含有不同的子控件
- 對比ArrayAdapter
1.數(shù)據(jù)源可變
2.可以支持多控件的適配
- from和to的表示含義
- 數(shù)據(jù)源:List<Map<String,Object>>
- 對比ArrayAdapter
1.比ArrayAdapter支持的item顯示的控件更多
2.數(shù)據(jù)源的格式變得稍微復(fù)雜一點(diǎn)
- 使用:
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>
自定義適配器
- 繼承自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,顯示給用戶
- LayoutInflater:布局映射器
1.作用:將xml文件轉(zhuǎn)化成View對象
2.findViewById通過View對象來調(diào)用的
- 通過代碼將需要適配的數(shù)目指定踪央,需要返回的view對象指定
- 通過from文件獲取布局映射器對象臀玄。就可以調(diào)用該方法的inflate方法將一個(gè)將xml文件轉(zhuǎn)化成View對象
- 用法:
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:下拉列表