android入门 — ListView
ListView主要是用来解决大量数据展示的问题,它的用途很广泛,几乎所有的app都会用到,比如说知乎、今日头条、微博、通讯录等。
ListView允许用户通过上下滑动的方式将屏幕外的数据滚动到屏幕中,同时原来的数据会滚动出屏幕。
1.ArrayAdapter的用法
①在布局中编写代码(添加ListView标签)
<?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上
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显示的数据一般都是从数据库中拿到的数据,在这里使用的是一个简单的数组来模拟这些数据。
查看源码可以发现这一部分的要求是
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类
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文件
<?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类。
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
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()
{
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);
} }
2.SimpleAdapter的用法
一、在布局文件中写代码
1.在activity_main.xml中添加ListView标签
2.在item.xml中编写行布局文件
二、在activity中编写代码
1.获取ListView对象
2.准备数据源
3.配置适配器
4.将适配器关联到ListView上
①设置activity_main.xml
声明ListView控件(注意必须使用LinearLayout)
<?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的一行中的控件的布局
<?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
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。
android入门 — ListView的更多相关文章
- android入门 — ListView点击事件
listView中提供了两种点击事件的处理方法,分别是OnItemClick和OnItemLongClick. OnItemClick提供的是点击操作的处理,OnItemLongClick提供的是长按 ...
- android入门 — ListView的优化
ListView的运行效率是比较低的,因为在getView()中每次都会将整个布局重新加载一遍,当ListView快速滚动的时候就会成为性能瓶颈. 调用View中的findViewById()方法获取 ...
- 【详细】Android入门到放弃篇-YES OR NO-》各种UI组件,布局管理器,单元Activity
问:达叔,你放弃了吗? 答:不,放弃是不可能的,丢了Android,你会心疼吗?如果别人把你丢掉,你是痛苦呢?还是痛苦呢?~ 引导语 有人说,爱上一个人是痛苦的,有人说,喜欢一个人是幸福的. 人与人之 ...
- Android入门之文件系统操作(一)简单的文件浏览器 (转)
Android入门之文件系统操作(一)简单的文件浏览器 (转) import java.io.File; import java.util.*; import android.app.A ...
- linux.linuxidc.com - /2011年资料/Android入门教程/
本文转自 http://itindex.net/detail/15843-linux.linuxidc.com-%E8%B5%84%E6%96%99-android Shared by Yuan 用户 ...
- Android—万能ListView适配器
ListView是开发中最常用的控件了,但是总是会写重复的代码,浪费时间又没有意义. 最近参考一些资料,发现一个万能ListView适配器,代码量少,节省时间,总结一下分享给大家. 首先有一个自定义的 ...
- Android中ListView实现图文并列并且自定义分割线(完善仿微信APP)
昨天的(今天凌晨)的博文<Android中Fragment和ViewPager那点事儿>中,我们通过使用Fragment和ViewPager模仿实现了微信的布局框架.今天我们来通过使用Li ...
- Android之ListView性能优化——一行代码绑定数据——万能适配器
如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...
- Android中ListView的几种常见的优化方法
Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法: 首先我们给出一个没有任何优化的Listview的Adapte ...
随机推荐
- python 视频配音、剪辑
一.FFmpeg的使用 首先下载FFmpeg然后将FFmpeg添加到环境路径中.运行cmd 输入ffmpeg无报错表示成功. 二.python中的使用 在python中执行cmd命令需要调用subpr ...
- 『Python基础-13』函数 Function
这篇笔记记录的知识点: 函数的基本概念 自定义函数 函数的几种参数 编程的三种方式: 1.OOP 面向对象编程,万物皆对象,以class为主,抽象化 2.POP 面向过程编程,万事皆过程,def定义过 ...
- JAVA基础 - 类的构造与实例化
一个简单的demo,主要运用: 抽象类,类的继承 类的实例化,构造函数 @Override重写父类方法 package week4; abstract class Person { void show ...
- MFC实现http连接、发送和接收数据
#include <afxinet.h> // 设置超时 CInternetSession session; session.SetOption(INTERNET_OPTION_CONNE ...
- 传说是小米家的一道面试题难倒了某Java程序员。扑克牌排序问题。
网上说的是有位网友在面试小米Java岗三次后,终于挺进了第三轮面试,结果还是败在了两道算法题上面. 1.写个读方法和写方法,实现读写锁 2.一副从1到n的牌,每次从牌堆顶取一张放桌子上,再取一张放牌堆 ...
- CSS-cascading stle sheets
CSS-cascading stle sheets 1. CSS 什么是CSS?CSS 指层叠样式表 (Cascading Style Sheets) 样式定义如何显示 HTML 元素 样式 ...
- BZOJ4247_挂饰_KEY
题目传送门 背包的变形,不得不说卡了我很久(估计是下午睡傻了). 设f[i][j]为前i个物品剩下j个挂钩. f[i][j]=max(f[i-1][j],f[i-1][max(j-a[i].x,0)+ ...
- 北京Uber优步司机奖励政策(2月28日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 武汉Uber优步司机奖励政策(8月31日~9月6日)
·奖励前提 *必须满足当周平均评分4.7星及以上,且当周接单率70%及以上,当周在线5小时且完成5单,才有资格获得奖励 * 各组别必须满足当周要求的成单率才有资格获得奖励,成单率由当周 滴滴快车单单2 ...
- 远离服务器宕机,腾讯WeTest正式推出服务器深度性能测试服务
WeTest 导读 随着城市发展趋向智慧化,不仅移动互联网应用正迅速融入出行.金融.医疗.娱乐等传统行业,跟随移动互联网成长起来的,还有用户对应用使用与消费的理性意识. 而在用户不断增加的同时,如何避 ...