三个常用的Adapter:ArrayAdapter、SimpleAdapter和BaseAdapter。
ArrayAdapter(数组适配器)
-
ArrayAdapter()参数
ArrayAdapter(Context context,@LayoutRes int resource,Object[] objects)
第一个参数:context上下文对象
第二个参数:每一个item的样式,可以使用系统提供,也可以自定义就是一个TextView
第三个参数:数据源,要显示的数据
系统提供的item的样式,可以试一试
simple_list_item1:单独的一行文本框
simple_list_item2:有两个文本框组成
simple_list_item_checked每项都是由一个已选中的列表项
simple_list_item_multiple_choice:都带有一个复选框
simple_list_item_single_choice:都带有一个单选框
-
setAdapter写法
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context=".MainActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/lv1">
</ListView>
</RelativeLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {
private ListView listView;
private ArrayAdapter<String> arrayAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
要显示的数据
String[] str={"Just","do","it"};
//创建ArrayAdapter(Context context,@LayoutRes int resource,Object[] objects)
arrayAdapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,str);
//获取ListView对象,通过调用setAdapter方法为ListView设置Adapter设置适配器
listView= this.<ListView>findViewById(R.id.lv1);
listView.setAdapter(arrayAdapter);
}
}
效果
-
entries数组资源xml文件写法
arrays.xml
在res\value下创建一个数组资源的xml文件:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="myarray">
<item>Just</item>
<item>do</item>
<item>it</item>
</string-array>
</resources>
activity_main.xml
ListView通过android:entries指定了列表的项数组:
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context=".MainActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:entries="@array/myarray">
</ListView>
</RelativeLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//都不用写findViewById,因为我们在这里不需要对它额外的进行操作
}
}
效果一样
使用泛型容器
activity_main.xml同setAdapter写法
MainActivity.java
public class MainActivity extends AppCompatActivity {
private ListView listView;
//ArrayAdapter里的类型是容器List里的类型String
private ArrayAdapter<String> arrayAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<String> data = new ArrayList<>();
data.add("Just");
data.add("do");
data.add("it");
arrayAdapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,data);
listView= this.<ListView>findViewById(R.id.lv1);
listView.setAdapter(arrayAdapter);
}
}
效果一样。
SimpleAdapter
-
simpleAdapter中五个参数
SimpleAdapter(Context context , List<?extends<Map<String,?>> data , int resource , String from , int[] to)
第一个参数:上下文对象
第二个参数:数据源是含有Map的一个集合
第三个参数:每一个item的布局文件
第四个参数:new String[]{}数组,数组的里面的每一项要与第二个参数中的存入map集合的的key值一样,一一对应
第五个参数:new int[]{}数组,数组里面的第三个参数item里面的控件id。
-
例子
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context=".MainActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/lv1"
>
</ListView>
</RelativeLayout>
listview_item.xml
<?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="horizontal">
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/icon"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="40sp"
android:id="@+id/text1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"
android:id="@+id/text2"/>
</LinearLayout>
</LinearLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {
private ListView listView;
private List<Map<String ,Object>> arraylist;
private SimpleAdapter simpleAdapter;
private int[] icon={R.drawable.timg001,R.drawable.timg002,R.drawable.timg003};
private String[] str1={"Just","do","it"};
private String[] str2={"run","learn","play"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
arraylist=new ArrayList<>();
//将Map<String,Object>添加进List中
for(int i=0;i<str1.length;i++)
{
Map<String ,Object> map = new HashMap<>();
map.put("icon",icon[i]);
map.put("str1",str1[i]);
map.put("str2",str2[i]);
arraylist.add(map);
}
simpleAdapter = new SimpleAdapter(this,arraylist,R.layout.listview_item,
new String[]{"icon","str1","str2"},
new int[]{R.id.icon,R.id.text1,R.id.text2});
listView=findViewById(R.id.lv1);
listView.setAdapter(simpleAdapter);
}
}
效果
BaseAdapter
-
字符串数组例子
新建一个java文件MyBaseAdapter.java,继承自BaseAdapter,并且实现它的4个基础方法。
public int getCount(): 适配器中数据集的数据个数;
public Object getItem(int position): 获取数据集中与索引对应的数据项;
public long getItemId(int position): 获取指定行对应的ID;
public View getView(int position,View convertView,ViewGroup parent): 获取没一行Item的显示内容。
package com.example.sheep.one;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class MyAdapter extends BaseAdapter {
private String[] data;
private Context context;
public MyAdapter(String[] data,Context context)
{
this.data=data;
this.context=context;
}
//返回item的个数
@Override
public int getCount() {
return data.length;
}
//返回每一个item对象
@Override
public Object getItem(int position) {
return data[position];
}
//返回每一个item的id
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView textView = new TextView(context);
textView.setText(data[position]);
return textView;
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context=".MainActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/lv1"
>
</ListView>
</RelativeLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {
private ListView listView;
private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String[] data= {"Just","do","it"};
myAdapter = new MyAdapter(data,this);
listView=findViewById(R.id.lv1);
listView.setAdapter(myAdapter);
}
}
效果
-
item自定义布局例子