列表控件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)
我们继续用书本的例子。