欢迎来到我的博客!
深化一下上一篇ListView文章的内容,因为接下来的app需要用到ListView,所以这两天对ListView在认真学习以下,而且自己动手打了代码。
ps:我用的是适配器来联系数据源与布局,不用ListView直接加数据源。
文章目录如下:
- 定义布局
- 在Activity中添加适配器
- 为适配器添加数据源
- 为布局添加适配器
一、定义布局
我们需要在layout里面新建一个布局,(不用项目里面给的布局,
这样方便一点),这里我把它命名为:main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--这里是自己加的代码-->
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
在添加布局的时候其实自己加的代码就是ListView这个组件拉进来就好,在加上id。然后就在mainActivity里面添加ListView组件联系起来,而且加载的布局文件要改成我们添加的main.xml文件
private ListView listView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listView = (ListView)findViewById(R.id.listView);
二、添加适配器
为什么要添加适配器呢?
我一开始看到要用适配器,有点懵,好像很难的样子,其实不会的,我们首先要知道为什么要用适配器。因为ListView如我们所知的一样,是用来显示我们一整个信息列表,就像我们微信的信息列表一样,这时候信息量很大是不,那就很难说在资源文件中直接用数组来列出每一个信息,而且这样文字大小、颜色都不能改变,再者,若是数据一直处于变动状态,那就不能实时改变了,所以适配器来做媒介,把数据和布局联系起来。!适配器是连接数据源与视图界面的桥梁~~~!
那就我所学的介绍一下我们ListView常用的两种适配器,再用两种适配器来实现同一个功能:一种是数组适配器:ArrayAdapter,另一种是简单适配器:SimpleAdapter(简单只是表象,功能可多着呢!)。
1、数组适配器 ArrayAdapter
这种适配器适用于接收格式单一的数据源(集合或数组):
//在方法体外先声明适配器
private ArrayAdapter<String>arr_adapter;
//在onCreate方法中添加一下代码
String[]arr_data = {"笑","搞笑","你搞笑","你真搞笑"};
arr_adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, arr_data);
listView.setAdapter(arr_adapter);
//1.新建一个适配器,声明之后,适配器的名字就是arr_adapter,其中数据源的类型就是声明中泛型所规定的类型String。
//ArrayAdapter(上下文,当前ListView加载的每一个列表项所对应的布局文件,数据源),这是初始化时用到的三个参数:
- 参数一:(context)上下文,在这里就是现在所处的Activity,就直接是用this来作为参数;
- 参数二:布局文件,在这里不是用我们自己定义的main.xml文件,可以调用到我们安卓项目中的android.R.layout.simple_list_item_1.xml,(好像也可以自己定义,但要只含一个TextView),在打代码的时候,他会提示很多文件,因为可能不同版本该文件的命名会不一样,所以注意要选对文件,不一定会跟我文件名一样,但是文件内容是一样的,文件中要只有一个TextView内容。
如果选错了文件,log会提示 You must supply a resourceID for a TextView,这时候我们重新看提示的文件在重选就好了。
这里的TextView就是我们列表中的每一个单位了。 - 参数三:数据源,这里就是你想添加到列表每一个单位的内容,就是代码中声明的,当时定义的数据源类型为String,所以就定义一个String类型数组:
String[]arr_data = {"笑","搞笑","你搞笑","你真搞笑"};
//3.视图加载适配器
配置好适配器之后记得要添加到布局文件中。用布局中的setAdapter()为布局添加适配器。
listView.setAdapter(arr_adapter);
完整的mainActivity代码如下:
public class MainActivity extends AppCompatActivity
{
private ListView listView;
private ArrayAdapter<String>arr_adapter;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listView = (ListView)findViewById(R.id.listView);
String[]arr_data = {"笑","搞笑","你搞笑","你真搞笑"};
dataList = new ArrayList<>();
arr_adapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,arr_data);
listView.setAdapter(arr_adapter);
}
}
运行之后就界面如下:
2、简单适配器SimpleAdapter
这种适配器适用格式复杂的数据,数据源只能是特定泛型的集合(图片、文字等或者复合起来的)
实现的步骤跟ArrayAdapter差不多:
1、先声明一个适配器,命名为simp_adapter,在声明一个数据源,命名为datalist;
private SimpleAdapter simp_adapter; //适配器
private List<Map<String,Object>>dataList; //泛型 数据源datalist
2、对两者进行初始化
先看适配器:
调用方法:
SimpleAdapter(android.content.Context context, java.util.List<? extends java.util.Map<java.lang.String,?>> data, int resource, java.lang.String[] from, int[] to )
其中有五个参数,比ArrayAdapter多了两个,前三个跟ArrayAdapter一样,只是在要注意SimpleAdapter的数据源是一个map组成的list集合,具体的获取数据下面会讲到。
因为数据源是一个map组成的list集合,每一个map都会去对应一个listview列表中的一行,每一个map(键-值对)中的键必须包含所有在from中所指定的键
- 参数四:from:map中的键名,是字符型数组,相当于你自己给下一个参数中的每一id去一个名字;
- to:绑定数据视图中的id,与from成对应关系;
我的程序中代码如下:
simp_adapter = new SimpleAdapter(this, getData(), R.layout.item, new String[]{"pic","text"}, new int[]{R.id.pic,R.id.text});
其中的:
R.id.pic :图片的id
R.id.text:TextView的id
“pic” => R.id.pic;
“text” => R.id.text;
再看数据源的代码:
dataList = new ArrayList<>();
这里只是初始化一个list集合,但是还没有内容,下面我们用一个方法来给他加内容:
private List<Map<String,Object>> getData()
{
for(int i=0;i<20;i++)
{
Map<String,Object>map = new HashMap<>();
map.put("pic",R.mipmap.ic_launcher);
map.put("text","笑"+i+"个");
dataList.add(map);
}
return dataList;
}
这里要注意几个点:
- 返回类型:这里我们要返回dataList作为我们的数据源,所以类型要跟dataList一样;
- 给键-值附具体内容: 键就是我们刚刚的from参数,这里就是字符串,第一个字符串”pic”,我们对应的值是一个ImageView(to中的第一个id,对应在布局文件中可以找到),那么我们要给他关系一张具体的图片,R.mipmap.ic_launcher,这个就是“值”了,这样待会就能显示在头像那个位置,TextView也同理,
- 最后要注意 写上 dataList.add(map) 将map添加到数据载体中;
3、为布局文件添加适配器
listView.setAdapter(simp_adapter);
完整的代码如下:
public class MainActivity extends AppCompatActivity {
private ListView listView;
private SimpleAdapter simp_adapter;
private List<Map<String,Object>>dataList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listView = (ListView)findViewById(R.id.listView);
dataList = new ArrayList<>();
simp_adapter = new SimpleAdapter(this,getData(),R.layout.item,new String[]{"pic","text"},new int[]{R.id.pic,R.id.text});
listView.setAdapter(simp_adapter);
}
private List<Map<String,Object>> getData()
{
for(int i=0;i<20;i++)
{
Map<String,Object>map = new HashMap<>();
map.put("pic",R.mipmap.ic_launcher);
map.put("text","笑"+i+"个");
dataList.add(map);
}
return dataList;
}
}
运行后界面如下:
总结一句:用适配器实现ListView界面的步骤如下:
新建适配器 –> 添加数据 –> 视图加载适配器
这篇博客是我这两天学习总结出来的,希望能对初步认识并开始打代码的优秀学员有帮助,要多打代码,多实践,不要只是看着别人的代码,加油!
如果我的总结有问题的话,也期待读者能跟我提出来,一起探讨探讨。