关于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. TensorFlow深度学习笔记 文本与序列的深度模型

    Deep Models for Text and Sequence 转载请注明作者:梦里风林 Github工程地址:https://github.com/ahangchen/GDLnotes 欢迎st ...

  2. SAR数据下载网站

    1] http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.144.2153&rep=rep1&type=pdf[2] ht ...

  3. QReadWriteLock读写锁的一点测试(它是逻辑锁,并没有与实物相联系),只有锁住了读,才允许再次读,否则一概不允许

    QReadWriteLock m_lock; void MyWidget::Button1(){ m_lock.lockForRead(); ShowMessage(tr("111" ...

  4. 去掉ExpandableListView的箭头图标

    到ExpandableListView时有个箭头图标系统自带的在你自定义布局也不能去掉只要设置一个属性即可,如下: settingLists.setGroupIndicator(null);  ~~~ ...

  5. linux之SQL语句简明教程---TRIM

    SQL 中的 TRIM 函数是用来移除掉一个字串中的字头或字尾.最常见的用途是移除字首或字尾的空白.这个函数在不同的资料库中有不同的名称: MySQL: TRIM( ), RTRIM( ), LTRI ...

  6. ubuntu设置系统时间与网络时间同步和时区

    Linux的时间分为System Clock(系统时间)和Real Time Clock (硬件时间,简称RTC). 系统时间:指当前Linux Kernel中的时间. 硬件时间:主板上有电池供电的时 ...

  7. OC中NSString 的常用方法

    NSString *str1 = @"BeiJing"; NSString *str2 = @"beijing"; //全部转为大写 NSLog(@" ...

  8. 字符编码介绍及java中的应用

    字符编码,就是对日常的控制符号.文字和常用符号的二进制表示.为了准确的表示如何编号,怎么生产八位字节流,Unicode Technical Report (UTR) #17提出现代编码模型的5个层次: ...

  9. 10个原生JavaScript技巧

    这些代码片段主要由网友们平时分享的作品代码里面和经常去逛网站然后查看源文件收集到的.把平时网站上常用的一些实用功能代码片段通通收集起来,方便网友们学习使用,利用好的话可以加快网友们的开发速度,提高工作 ...

  10. 关于rem自适应的一点研究

    参考地址:http://m.ctrip.com/html5/ https://www.amazon.cn/ rem是相对于html根元素的一个单位.rem是px的16倍,即1rem = 16px;除了 ...