列表控件ListView

列表控件ListView-简单用法

这是一个非常常用的控件。

我们的屏幕邮箱,借助这个控件可以在屏幕上面显示更多的数据。

通过手指上下滑动将屏幕外的数据显示到屏幕内。

简单用法

新建一个TestListView项目

在视图中添加如下代码 加入ListView

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
        android:id="@+id/listview1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>Code language: HTML, XML (xml)

初始化数据源

public class MainActivity extends AppCompatActivity {
    private  String[] courses = {"java入门","android入门","C#入门","c语言","asp.net mvc"};

    @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,courses);

        ListView listView = (ListView) findViewById(R.id.listview1);
        listView.setAdapter(adapter);
    }
}Code language: JavaScript (javascript)

这些数据 可以从网上下载(比如web api) 也可以充数据库读取 甚至我们这里是在代码里面写一个字符串数组。

数据无法直接传递给ListView 需要借助适配器来完成。

Android提供大量的适配器。我们这里使用ArrayAdapter

我们使用android.R.layout.simple_list_item_1作为ListView的子布局。

它是android内置的布局文件 只有一个TextView 显示一段文字。

列表控件ListView-定制界面

如果只是简单显示一段文字 有点简单

我们可以在列表玻璃门显示更丰富的内容。

添加一个Book实体类

package com.foxdevelop.www.testlistview;

public class Book {
    private String name;
    private int imageId;

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

    public String getName()
    {
        return name;
    }

    public int getImageId()
    {
        return imageId;
    }
}Code language: PHP (php)

添加一个book的视图文件

<?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">
    <ImageView
        android:id="@+id/imageid"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="12dp"
        />
</LinearLayout>Code language: HTML, XML (xml)

自定义适配器

package com.foxdevelop.www.testlistview;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

public class BookAdapter extends ArrayAdapter<Book> {
    private  int resource;

    public BookAdapter(@NonNull Context context, int resource, @NonNull List<Book> objects) {
        super(context, resource, objects);
        this.resource = resource;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        Book book =  getItem(position);//获取当前这本书
        View view = LayoutInflater.from(getContext()).inflate(resource,parent,false);

        ImageView imageView = (ImageView) view.findViewById(R.id.imageid);
        imageView.setImageResource(book.getImageId());

        TextView name = (TextView) view.findViewById(R.id.name);
        name.setText(book.getName());

        return view;
    }
}Code language: JavaScript (javascript)

在活动的oncreate里面 初始化数据源

package com.foxdevelop.www.testlistview;

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 List<Book> courses = new ArrayList<Book>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        LoadBooks();
        BookAdapter adapter = new BookAdapter(MainActivity.this,R.layout.booklistview,courses);//加载实体类资源

        ListView listView = (ListView) findViewById(R.id.listview1);
        listView.setAdapter(adapter);
    }

    private  void LoadBooks()
    {
        courses.add(new Book("人类思想史上第一",R.drawable.access));
        courses.add(new Book("剥削阶段政治",R.drawable.book));
        courses.add(new Book("印度古代法律的珍贵文献",R.drawable.bookmarks));
        courses.add(new Book("钦定罗马私法教科书",R.drawable.center));
        courses.add(new Book("知识就是力量",R.drawable.date));
        courses.add(new Book("我的民法典会永远存在",R.drawable.clock));
        courses.add(new Book("研究美国民主的经典之作",R.drawable.ftp));
        courses.add(new Book("西方国际法权威教材",R.drawable.notes));
        courses.add(new Book("最贴近历史真实的力作",R.drawable.set));
        courses.add(new Book("宗教改革的一面镜子",R.drawable.energy));
        courses.add(new Book(" 神学的秘密就是人本学",R.drawable.tux));
        courses.add(new Book("三百多年前就介绍到了中国的名",R.drawable.science));
        courses.add(new Book("刻画伪君子的千古杰作",R.drawable.joystick));
        courses.add(new Book("没有围墙的名牌大学",R.drawable.center));
        courses.add(new Book("人类思想史上第一个乌托邦方案",R.drawable.access));
    }
}Code language: JavaScript (javascript)

通过设置

android:orientation=”horizontal”

可以让它横着拍

优化ListView性能

我们现在的活动,每次打开都会去加载数据源,这样会影响运行效率。通过对View的缓存。我们可以提高运行速度。

通过对convertView的判断 我们就不用每次都去获取view

public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    Book book =  getItem(position);//获取当前这本书
    View view;
    if (convertView==null)
    {
        view = LayoutInflater.from(getContext()).inflate(resource,parent,false);
    }
    else
    {
        view = convertView;
    }

    ImageView imageView = (ImageView) view.findViewById(R.id.imageid);
    imageView.setImageResource(book.getImageId());

    TextView name = (TextView) view.findViewById(R.id.name);
    name.setText(book.getName());

    return view;
}Code language: PHP (php)

把控件缓存起来

定义一个保存图片控件和文本控件的类

class  ViewData
{
    ImageView imageUI;
    TextView textViewUI;
}Code language: JavaScript (javascript)
package com.foxdevelop.www.testlistview;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

public class BookAdapter extends ArrayAdapter<Book> {
    private  int resource;

    public BookAdapter(@NonNull Context context, int resource, @NonNull List<Book> objects) {
        super(context, resource, objects);
        this.resource = resource;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        Book book =  getItem(position);//获取当前这本书
        View view;
        ViewUI viewUI;
        if (convertView==null)
        {
            view = LayoutInflater.from(getContext()).inflate(resource,parent,false);
            ImageView imageView = (ImageView) view.findViewById(R.id.imageid);//需要获取图片控件
            TextView textView = (TextView) view.findViewById(R.id.name);

            viewUI = new ViewUI();
            viewUI.imageUI = imageView;
            viewUI.textViewUI = textView;
            view.setTag(viewUI);
        }
        else
        {
            view = convertView;
            viewUI = (ViewUI)view.getTag();
        }

        viewUI.imageUI.setImageResource(book.getImageId());
        viewUI.textViewUI.setText(book.getName());
        return view;
    }

    class  ViewUI
    {
        ImageView imageUI;
        TextView textViewUI;
    }
}Code language: JavaScript (javascript)

ListView点击事件

给listview中的项添加点击事件。

比如我们实现点击每一项的时候 显示书本的名称。

在主活动的oncreate里面

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    LoadBooks();
    BookAdapter adapter = new BookAdapter(MainActivity.this,R.layout.booklistview,courses);//加载实体类资源

    final ListView listView = (ListView) findViewById(R.id.listview1);
    listView.setAdapter(adapter);

    //点击事件
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {//i 就是当前这一项的索引号
            Book  b =courses.get(i);
            Toast.makeText(MainActivity.this,b.getName(),Toast.LENGTH_LONG).show();
        }
    });
}Code language: PHP (php)

gladle中dependencies中引入依赖库

Configuration ‘compile’ is obsolete and has been replaced with ‘implementation’ and ‘api’.

It will be removed at the end of 2018. For more information see: http://d.android.com/r/tools/update-dependency-configurations.html

我们需要引入对

android.support.v7.widget.RecyclerView

的依赖库的支持。

<?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.support.v7.widget.RecyclerView
       android:id="@+id/testrecy"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       >
   </android.support.v7.widget.RecyclerView>

</LinearLayout>Code language: HTML, XML (xml)

滚动控件RecyclerView的使用-1

ListView很强大。它的应用很广泛,今天还有很多应用在使用

不过它的性能会差一点。扩展性也不强。

只能实现数据的纵向滚动。如果横向滚动则办不到。

RecyclerView是一个增强型的ListView

它可以实现ListView同样效果。并且优化了ListView

还优化了它的不足之处。

官方推荐使用个RecyclerView

基本用法

首先大家 先在gladle中引入

compile ‘com.android.support:recyclerview-v7:27.1.1’

上一节中 我们添加另一个RecyclerView

<android.support.v7.widget.RecyclerView
    android:id="@+id/testrecy"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>Code language: HTML, XML (xml)

我们继续用书本的例子。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注