关于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. Train Problem I--hdu1022(栈)

    Train Problem I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  2. TensorFlow 深度学习笔记 Stochastic Optimization

    Stochastic Optimization 转载请注明作者:梦里风林 Github工程地址:https://github.com/ahangchen/GDLnotes 欢迎star,有问题可以到I ...

  3. 在Azure Cloud Service中部署Java Web App(2)

    接上文. 9.在进行发布之前,需要对我们的订阅做一些设置,因为默认情况下,Azure的service end指向的是Azure global的站点,如果我们要将服务发布在Azure的中国站点,需要做下 ...

  4. Nginx 变量漫谈(五)

    前面在 (二) 中我们已经了解到变量值容器的生命期是与请求绑定的,但是我当时有意避开了“请求”的正式定义.大家应当一直默认这里的“请求”都是指客户端发起的 HTTP 请求.其实在 Nginx 世界里有 ...

  5. Sql Server专题三:SQL操作与技巧

    一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- ...

  6. android---EditText黄色边框

    http://liuzhichao.com/p/612.html 自定义android控件EditText边框背景 柳志超博客 » Program » Andriod » 自定义android控件Ed ...

  7. 常用433MHZ无线芯片性能对比表分享

    常用433M芯片性能对比: 芯片型号 SI4432 CC1101 NRF905 A7102 A7108 输出功率 20dBm 10dBm 10dBm 15dBm 20dBm 功耗 TX:85mA RX ...

  8. Java魔法堂:打包知识点之META-INF/MAINFEST.MF(转)

    一.前言 通过执行形如 jar -cvf src.jar src 命令将多个.class文件打包成JAR包时,你会发现JAR包中除了src目录外还多了个MATE-INF/MAINFEST.MF,那是为 ...

  9. This function or variable may be unsafe. Consider using scanf_s instead.

    去掉安全检查,开头加上即可: #define _CRT_SECURE_NO_WARNINGS 或者: 严重性代码 说明项目文件行禁止显示状态 错误C4996 'scanf': This functio ...

  10. Android的Activity切换动画特效库SwitchLayout,视图切换动画库,媲美IOS

    由于看了IOS上面很多开发者开发的APP的视图界面切换动画体验非常好,这些都是IOS自带的,但是Android的Activity等视图切换动画并没有提供原生的,所以特此写了一个可以媲美IOS视图切换动 ...