前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >android入门 — ListView

android入门 — ListView

作者头像
Mister24
发布2018-05-14 11:13:19
1.2K0
发布2018-05-14 11:13:19
举报
文章被收录于专栏:java初学java初学

  ListView主要是用来解决大量数据展示的问题,它的用途很广泛,几乎所有的app都会用到,比如说知乎、今日头条、微博、通讯录等。  

  ListView允许用户通过上下滑动的方式将屏幕外的数据滚动到屏幕中,同时原来的数据会滚动出屏幕。

1.ArrayAdapter的用法

①在布局中编写代码(添加ListView标签)

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@+id/list_item"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

  加入ListView标签的方法很简单,只需要声明id,设置width和height即可。这时候会出现一个预览的界面:

  可以看出整个界面全部被listview占据。

②修改MainActivity中的代码

  需要完成的步骤可以分解为:

  1.获取ListView对象

  2.准备数据源

  3.配置适配器

  4.将适配器关联到ListView上

代码语言:javascript
复制
package es.source.code.activity.simplelistviewtest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends AppCompatActivity {

    //准备数据源
    private String[] data = {"apple", "banana", "orange", "watermelon", "pear", "grape", "pineapple", "strawberry", "cherry", "mango"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //配置适配器
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);
        //获取ListView对象
        ListView listView = (ListView)findViewById(R.id.list_item1);
        //将适配器关联到ListView
        listView.setAdapter(adapter);

    }
}

  ListView显示的数据一般都是从数据库中拿到的数据,在这里使用的是一个简单的数组来模拟这些数据。

  查看源码可以发现这一部分的要求是

代码语言:javascript
复制
 public ArrayAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull T[] objects) {
        this(context, resource, 0, Arrays.asList(objects));
    }

  ArrayAdapter适用于简单的文字列表的适配,同时它的参数列表包含上下文、ListView子项布局的id以及要适配的数据

  在这里我们是用的是系统自带的android.R.layout.simple_list_item_1,里面只有一个TextView,可以用于简单的显示一段文本。

  最后调用ListView的setAdapter()方法,将构建好的适配器对象传递进去。这样就使得ListView和数据之间的关联建立起来了。

定制ListView的界面

①新建一个Fruit类

代码语言:javascript
复制
public class Fruit
{
    private String name;
    private int imageId;

    public Fruit(String name, int imageId)
    {
        this.name = name;
        this.imageId = imageId;
    }

    public String getName() {
        return name;
    }

    public int getImageId() {
        return imageId;
    }
}

  这个类的作用是作为ListView适配器的适配类型。其中name表示水果的名字,imageId表示水果对应的图片资源。

②为ListView的子项指定一个自定义的布局

  新建一个fruit_item.xml文件

代码语言:javascript
复制
<?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">

    <ImageView
        android:id="@+id/fruit_image"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        />

    <TextView
        android:id="@+id/fruit_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_marginLeft="10dp"
        />
</LinearLayout>

  在这里定义了一个ImageView用于显示水果的图片,定义了一个TextView用于显示水果的名称。

③创建一个自定义的适配器

这个适配器继承自ArrayAdapter,并将泛型指定为Fruit类。

代码语言:javascript
复制
public class FruitAdapter extends ArrayAdapter
{
    private int resourceId;
    public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects)
    {
        super(context, textViewResourceId, objects);
        resourceId = textViewResourceId;
    }

    public View getView(int position, View convertView, ViewGroup parent)
    {
        Fruit fruit = (Fruit) getItem(position);
        View view = LayoutInflater.from(getContext()).inflate(resourceId, null);
        ImageView fruitImage = (ImageView)view.findViewById(R.id.fruit_image);
        TextView fruitName = (TextView)view.findViewById(R.id.fruit_name);
        fruitImage.setImageResource(fruit.getImageId());
        fruitName.setText(fruit.getName());
        return view;
    }
}

  首先要重写父类的构造函数,用于将上下文、ListView子项布局的id和数据都传递进去。此外重写了getView()方法,这个方法在每个子项滚动到屏幕内的时候被调用。在getView()方法中,首先通过getItem()方法得到当前项的Fruit实例,然后通过LayoutInflater来为这个子项加载我们传入的布局,接着调用View的findViewById()方法分别获取ImageView和TextView实例,并分别调用它们的setImageResource()和setText()方法来设置显示的图片和文字,最后将布局返回。

④修改MainActivity,关联ListView

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {

    private List<Fruit> fruitList = new ArrayList<Fruit>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initFruits();


        FruitAdapter adapter = new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList);
        ListView listView = (ListView)findViewById(R.id.fruit_item);
    }

    private void initFruits()
    {
代码语言:javascript
复制
Fruit apple = new Fruit("Apple", R.drawable.ic_account_circle_black_48dp);
fruitList.add(apple);
Fruit apple1 = new Fruit("Apple", R.drawable.ic_add_shopping_cart_black_48dp);
fruitList.add(apple1);
Fruit apple2 = new Fruit("Apple", R.drawable.ic_alarm_add_black_48dp);
fruitList.add(apple2);
Fruit apple3 = new Fruit("Apple", R.drawable.ic_aspect_ratio_black_48dp);
fruitList.add(apple3);


Fruit apple11 = new Fruit("Apple", R.drawable.ic_account_circle_black_48dp);
fruitList.add(apple11);
Fruit apple111 = new Fruit("Apple", R.drawable.ic_add_shopping_cart_black_48dp);
fruitList.add(apple111);
Fruit apple211 = new Fruit("Apple", R.drawable.ic_alarm_add_black_48dp);
fruitList.add(apple211);
Fruit apple311 = new Fruit("Apple", R.drawable.ic_aspect_ratio_black_48dp);
fruitList.add(apple311);

Fruit apple22 = new Fruit("Apple", R.drawable.ic_account_circle_black_48dp);
fruitList.add(apple22);
Fruit apple12 = new Fruit("Apple", R.drawable.ic_add_shopping_cart_black_48dp);
fruitList.add(apple12);
Fruit apple222 = new Fruit("Apple", R.drawable.ic_alarm_add_black_48dp);
fruitList.add(apple222);
Fruit apple32 = new Fruit("Apple", R.drawable.ic_aspect_ratio_black_48dp);
fruitList.add(apple32);
代码语言:javascript
复制
} }

2.SimpleAdapter的用法

   一、在布局文件中写代码

    1.在activity_main.xml中添加ListView标签

    2.在item.xml中编写行布局文件

   二、在activity中编写代码

    1.获取ListView对象

    2.准备数据源

    3.配置适配器

    4.将适配器关联到ListView上

①设置activity_main.xml

声明ListView控件(注意必须使用LinearLayout)

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@+id/mylist"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" >
    </ListView>
</LinearLayout>

②设置simple_item.xml

设置具体的ListView的一行中的控件的布局

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/header"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="10dp" />
    <LinearLayout
        android:orientation="vertical"
        android:layout_height="wrap_content"
        android:layout_width="match_parent">
        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="20dp"
            android:paddingLeft="10dp"/>
        <TextView
            android:id="@+id/desc"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:textSize="10dp"
            android:paddingLeft="10dp"/>
    </LinearLayout>>
</LinearLayout>

③MainActivity.java

代码语言:javascript
复制
public class MainActivity extends Activity
{
    private String[] names = new String[]{"膜法师1号","膜法师2号","膜法师3号","膜法师4号",
                                            "膜法师5号","膜法师6号","膜法师7号","膜法师8号",
                                            "膜法师9号","膜法师10号","膜法师11号","膜法师12号"};
    private String[] descs = {"我为长者续一秒","最喜欢谈笑风生","这时候我想吟两句诗","总想搞个大新闻","我为长者续1秒",
                                "别总想搞大新闻","比你们不知道高到哪里去","西方哪个国家我没去过","水可载舟亦可覆舟","too young, too simple",
                                "你们啊,naive","蛤蛤蛤"};
    private int[] imageIds = new int[]{
            R.drawable.pic1, R.drawable.pic2,R.drawable.pic3, R.drawable.pic4,
            R.drawable.pic5, R.drawable.pic6,R.drawable.pic7, R.drawable.pic8,
            R.drawable.pic9, R.drawable.pic10,R.drawable.pic11, R.drawable.pic12};
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //创建一个List集合,List集合的元素是map
        List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
        for(int i = 0; i < names.length; i++)
        {
            Map<String, Object> listItem = new HashMap<>();
            listItem.put("header", imageIds[i]);
            listItem.put("personName", names[i]);
            listItem.put("desc", descs[i]);
            listItems.add(listItem);
        }
        //创建一个SimpleAdapter
        SimpleAdapter simpleAdapter = new SimpleAdapter(
                this,
                listItems,//
                R.layout.simple_item,//listview的布局情况
                new String[]{"personName", "header", "desc"},
                new int[]{R.id.name, R.id.header, R.id.desc}
                );
        ListView list = (ListView)findViewById(R.id.mylist);
        //为ListView设置Adapter
        list.setAdapter(simpleAdapter);
    }
}

  注意SimpleAdapter的参数列表

第一个参数:声明上下文

第二个参数:该参数应该是一个List<? extends Map<String, ?>>类型的数据集合对象,每个对象生成一个具体的列表项;

第三个参数:制定了一个界面布局的ID,在这里使用的是simple_item.xml作为列表项组件;

第四个参数:该参数应该是一个String[]类型的参数,该参数决定提取Map<String, ?>对象中哪些key对应的value来生成

3.自定义Adapter

由于ArrayAdapter和SimpleAdapter不能满足所有的需求,所以我们可能需要自己定义Adapter来实现某些功能。

  具体的步骤如下:   1.创建自己的adapter,继承自BaseAdapter,重写以下四个方法:

    (1)public int getCount();

    (2)public Object getItem(int position);

    (3)public long getItemId(int position);

    (4)public View getView(int position, View convertView, ViewGroup parent)。

  2.添加数据集合和反射器实现构造器和setter方法;

  4.实现getView方法;

  5.关联ListView。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-05-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档