ListView学习

欢迎来到我的博客!

  深化一下上一篇ListView文章的内容,因为接下来的app需要用到ListView,所以这两天对ListView在认真学习以下,而且自己动手打了代码。
  ps:我用的是适配器来联系数据源与布局,不用ListView直接加数据源。

文章目录如下:

  1. 定义布局
  2. 在Activity中添加适配器
  3. 为适配器添加数据源
  4. 为布局添加适配器

一、定义布局

  我们需要在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界面的步骤如下:
新建适配器 –> 添加数据 –> 视图加载适配器

这篇博客是我这两天学习总结出来的,希望能对初步认识并开始打代码的优秀学员有帮助,要多打代码,多实践,不要只是看着别人的代码,加油!
如果我的总结有问题的话,也期待读者能跟我提出来,一起探讨探讨。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值