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