关于Android Adapter(适配器),参考Devin Zhang’s blog。简单的说,Adapter起到的作用是使得前端的显示和后端的数据能够适配,用以下代码作为例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
public class MainActivity extends Activity{

    private List<fruit> myFruits = new ArrayList<fruit>();//将数据定义为实例

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initialFruits();
setContentView(R.layout.activity_main);//与R.layout.activity_main布局绑定
ListView lv = (ListView) findViewById(R.id.lv);
fruitAdapter adapter = new fruitAdapter(MainActivity.this,R.layout.list_item,myFruits);//fruitAdpter的三个参数依次为,上下文context,ListView单项布局文件,集合类型的数据
lv.setAdapter(adapter);//用adapter做适配器(就理解为ListView看得懂并且存放有数据的容器)
}
//初始化实例变量myFruits
private void initialFruits(){
fruit orange = new fruit("orange",R.drawable.pa);
myFruits.add(orange);
fruit grape = new fruit("grape",R.drawable.pb);
myFruits.add(grape);
fruit milk = new fruit("milk",R.drawable.pc);
myFruits.add(milk);
fruit bean = new fruit("bean",R.drawable.pd);
myFruits.add(bean);
fruit kid = new fruit("kid",R.drawable.pe);
myFruits.add(kid);
fruit banana = new fruit("banana",R.drawable.pf);
myFruits.add(banana);
fruit lamp = new fruit("lamp",R.drawable.pg);
myFruits.add(lamp);
fruit hack = new fruit("hack",R.drawable.ph);
myFruits.add(hack);
fruit keyboard = new fruit("keyboard",R.drawable.pi);
myFruits.add(keyboard);
fruit water = new fruit("water",R.drawable.pj);
myFruits.add(water);
fruit mouse = new fruit("mouse",R.drawable.pk);
myFruits.add(mouse);
fruit ear = new fruit("ear",R.drawable.pl);
myFruits.add(ear);
}
}

关于fruitAdapter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class fruitAdapter extends ArrayAdapter<fruit>{

    private int resourceId;
//textViewResourceId即为传入的ListView的单项布局文件id
public fruitAdapter(Context context,int textViewResourceId, List<fruit> objects) {
super(context, textViewResourceId, objects);
//adapter对象的resourceId实例变量保存ListView的单项布局文件id,以供getView()使用
resourceId = textViewResourceId;
} //在每个子项被滚动到屏幕内的时候调用getView()
@Override
public View getView(int position, View convertView, ViewGroup parent) {
fruit newFruit = getItem(position);
View view = LayoutInflater.from(getContext()).inflate(resourceId,null);
ImageView imageView = (ImageView) view.findViewById(R.id.fruit_image);
TextView textView = (TextView) view.findViewById(R.id.fruit_name);
imageView.setImageResource(newFruit.getId());
textView.setText(newFruit.getName());
return view;
}
}

对于getView(),《第一行代码》中给出的解释是“在每个子项被滚动到屏幕内的时候会被调用”。这句话的另一层意思是:凡是ListView中可见的子项,均调用了getView()方法。事实上也只能如此,因为在构造函数中并未告诉ListView如何呈现样式。也因此呢,整个ListView的过程是:创建Adapter(需调用构造函数)->特定的ListView指定该Adapter->在屏幕需要显示子项时调用getView()

接着附上fruit类的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class fruit {
private String name;
private int pic_id; public fruit(String fname,int id){
this.name = fname;
this.pic_id = id;
} public String getName(){
return name;
} public int getId(){
return pic_id;
}
}

最后就出现了这样的ListView
界面
界面

这样看来图片的大小得事先选好,图片越大,速度越慢

滑动的时候确实会卡顿,优化如下:
getView()的convertView用于缓存加载好的布局,不至于每次有子项滑入屏幕内都要加载一次布局

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//在每个子项被滚动到屏幕内的时候调用getView()
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
ViewHolder viewHolder;
fruit myFruit = getItem(position);
if(convertView == null){
viewHolder = new ViewHolder();
view = LayoutInflater.from(getContext()).inflate(resourceId,null);
viewHolder.imageView = (ImageView) view.findViewById(R.id.fruit_image);
viewHolder.textView = (TextView) view.findViewById(R.id.fruit_name);
view.setTag(viewHolder);
}
else{
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
viewHolder.imageView.setImageResource(myFruit.getId());
viewHolder.textView.setText(myFruit.getName());
return view;
}

从优化ListView过程中,看出至始至终都是使用第一次加载好的view,索性在view里面再加上存有控件实例的viewHolder

写子项->适配器->item->mainActivity(传数据)

初探ListView和Adapter的更多相关文章

  1. ListView和Adapter数据适配器的简单介绍

    ListView 显示大量相同格式数据 常用属性: listSelector            listView每项在选中.按下等不同状态时的Drawable divider            ...

  2. ListView和Adapter的配合使用以及Adapter的重写

    ListView和Adapter的使用   首先介绍一下ListView是Android开发过程中较为常见的组件之一,它将数据以列表的形式展现出来.一般而言,一个ListView由以下三个元素组成: ...

  3. 在为ListView设置adapter时出错

    为listView设置adapter,代码如下: SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems, R.layout.m ...

  4. Android listview与adapter用法

    listview与adapter用法 博客分类: android   一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的选择点击等操作. 第一点很好理解,ListView ...

  5. ListView 和 Adapter用法

    一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的选择点击等操作. 第一点很好理解,ListView就是实现这个功能的.第二点也不难做到,在后面的学习中读者会发现,这非常 ...

  6. ListView及Adapter的使用

    一.使用ArrayAdapter 其中ArrayAdapter的构造函数有如下几个,其中resource是指每个列表项的布局文件,objects是指列表项的数据源,此处通常指一个数组 ArrayAda ...

  7. 初探ListView

    ListView可能是Android开发中最常用的一个控件,但要用的纯熟还需要不断的锻炼. 建立简单的ListView 1.在布局文件(.xml)中添加<ListView>标签 2.在Ma ...

  8. android 开发之 ListView 与Adapter 应用实践

    在开发android中,ListView 的应用显得非常频繁,只要需要显示列表展示的应用,可以说是必不可少,下面是记录开发中应用到ListView与Adapter 使用的实例: ListView 所在 ...

  9. [Android] Android RecycleView和ListView 自定义Adapter封装类

    在网上查看了很多对应 Android RecycleView和ListView 自定义Adapter封装类 的文章,主要存在几个问题: 一).网上代码一大抄,复制来复制去,大部分都运行不起来,或者 格 ...

随机推荐

  1. 变态最大值--nyoj题目811

    变态最大值 时间限制:1000 ms  |  内存限制:65535 KB 难度:1   描述 Yougth讲课的时候考察了一下求三个数最大值这个问题,没想到大家掌握的这么烂,幸好在他的帮助下大家算是解 ...

  2. C++ 前置声明 和 包含头文件 如何选择

    假设有一个Date类 Date.h class Date { private: int year, month, day; }; 如果有个Task类的定义要用到Date类,有两种写法 其一 Task1 ...

  3. javascript的stringFormat函数实现

    写一个简单的stringFormat来给自己用 function stringFormat(format, args) { var formatData; if (arguments.length = ...

  4. Nginx 配置指令的执行顺序(四)

    ngx_lua 模块提供了配置指令 access_by_lua,用于在 access 请求处理阶段插入用户 Lua 代码.这条指令运行于 access 阶段的末尾,因此总是在 allow 和 deny ...

  5. USB HID复合设备实例—键盘+鼠标

    实现这种USB HID复合设备有两种方法,在<USB HID协议入门>一节已经讲到其中一种方法,说一个USB HID设备可以包含多种功能的报告描述符合集,这样可以实现复合设备,如带鼠标功能 ...

  6. [Leetcode][Python]45: Jump Game II

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 45: Jump Game IIhttps://oj.leetcode.com ...

  7. Tengine笔记1:安装Tengine和Tengine说明

    什么是Tengine 官方帮助文档:http://tengine.taobao.org/nginx_docs/cn/   Tengine的安装   新建tengine用户组 groupadd -r n ...

  8. C++中函数的默认参数

    使用方法: (1)在函数声明或定义时,直接对参数赋值,该参数就是默认参数. (2)在函数调用时,省略部分或全部参数,这时就会使用默认参数进行代替. 注意事项: (1)一般在声明函数是设置默认参数. 如 ...

  9. DSOframer 无法正常加载的解决方案

    不了解 DSOframer 的朋友,可以先参考文章 DSOframer 的简单介绍和资源整理. 在使用 DSOframer 时,经常会碰到各种奇奇怪怪的问题,最常见的就是控件不能正常加载.大家可以按下 ...

  10. C#核编之X++详解

    重点:当X++单独使用时,就是没有其他符号参与运算,这时X做自增运算,而当X++与其他运算符一起参与运算时,这时的X++因为运算优先级低,所以是最后一个参与运算的,所以看下面代码 ; x=x++;// ...