1. BaseAdapter:

对于ListView、GridView、Gallery、Spinner等等,它是它们的适配器,直接继承自接口类Adapter的,使用BaseAdapter时需要重写很多方法,其中最重要的当属getView,因为这会涉及到ListView优化等问题,BaseAdapter与其他Adapter有些不一样,使用BaseAdapter中需要实现一个继承自BaseAdapter的类,并且重写里面的很多方法,其他的Adapter可以直接在其构造方法中进行数据的设置:

下面getItem()和getItemId()分别是用来返回Object类型对象和long类型的值,不一定要在这两个方法中编写具体的代码,使用这两个方法返回与当前列表项相关的对象和列表项的ID(当然也可以返回任何与业务有关的数据);

必须在getCount()和getView()方法中编写实际的代码。getCount()方法返回列表数据的总数,例如,列表数据来自数组,getCount()方法返回数组的长度。getView()方法返回在当前列表项使用的View对象。

  1. class MyAdapter extends BaseAdapter
  2. {
  3. private Context context;
  4. public MyAdapter(Context context)
  5. {
  6. this.context = context;
  7. }
  8. @Override
  9. public int getCount() {
  10. //在此适配器中所代表的数据集中的条目数
  11. return 0;
  12. }
  13. @Override
  14. public Object getItem(int position) {
  15. // 获取数据集中与指定索引对应的数据项
  16. return null;
  17. }
  18. @Override
  19. public long getItemId(int position) {
  20. //取在列表中与指定索引对应的行id
  21. return 0;
  22. }
  23. @Override
  24. public View getView(int position, View convertView, ViewGroup parent) {
  25. // Get a View that displays the data at the specified position in the data set.
  26. return null;
  27. }
  28. }

这里面没什么难度,但是这个getView方法必须好好处理,也是最麻烦的:

第一种:没有任何处理,不建议这样写。如果数据量少看将就,但是如果列表项数据量很大的时候,会每次都重新创建View,设置资源,严重影响性能,所以从一开始就不要用这种方式:

  1. @Override
  2. public View getView(int position, View convertView, ViewGroup parent) {
  3. View item = mInflater.inflate(R.layout.list_item, null);
  4. ImageView img = (ImageView)item.findViewById(R.id.img)
  5. TextView title = (TextView)item.findViewById(R.id.title);
  6. TextView info = (TextView)item.findViewById(R.id.info);
  7. img.setImageResource(R.drawable.ic_launcher);
  8. title.setText("Hello");
  9. info.setText("world");
  10. return item;
  11. }

第二种ListView优化:通过缓存convertView,这种利用缓存contentView的方式可以判断如果缓存中不存在View才创建View,如果已经存在可以利用缓存中的View,提升了性能。

  1. public View getView(int position, View convertView, ViewGroup parent) {
  2. if(convertView == null)
  3. {
  4. convertView = mInflater.inflate(R.layout.list_item, null);
  5. }
  6. ImageView img = (ImageView)convertView.findViewById(R.id.img)
  7. TextView title = (TextView)convertView.findViewById(R.id.title);
  8. TextView info = (TextView)ConvertView.findViewById(R.id.info);
  9. img.setImageResource(R.drawable.ic_launcher);
  10. title.setText("Hello");
  11. info.setText("world");
  12. return convertView;
  13. }

第三种ListView优化:通过convertView+ViewHolder来实现,ViewHolder就是一个静态类,使用 ViewHolder 的关键好处是缓存了显示数据的视图(View),加快了 UI 的响应速度。

当我们判断 convertView == null  的时候,如果为空,就会根据设计好的List的Item布局(XML),来为convertView赋值,并生成一个viewHolder来绑定converView里面的各个View控件(XML布局里面的那些控件)。再用convertView的setTag将viewHolder设置到Tag中,以便系统第二次绘制ListView时从Tag中取出。(看下面代码中)

如果convertView不为空的时候,就会直接用convertView的getTag(),来获得一个ViewHolder。

  1. //在外面先定义,ViewHolder静态类
  2. static class ViewHolder
  3. {
  4. public ImageView img;
  5. public TextView title;
  6. public TextView info;
  7. }
  8. //然后重写getView
  9. @Override
  10. public View getView(int position, View convertView, ViewGroup parent) {
  11. ViewHolder holder;
  12. if(convertView == null)
  13. {
  14. holder = new ViewHolder();
  15. convertView = mInflater.inflate(R.layout.list_item, null);
  16. holder.img = (ImageView)item.findViewById(R.id.img)
  17. holder.title = (TextView)item.findViewById(R.id.title);
  18. holder.info = (TextView)item.findViewById(R.id.info);
  19. convertView.setTag(holder);
  20. }else
  21. {
  22. holder = (ViewHolder)convertView.getTag();
  23. holder.img.setImageResource(R.drawable.ic_launcher);
  24. holder.title.setText("Hello");
  25. holder.info.setText("World");
  26. }
  27. return convertView;
  28. }

2. BaseAdapter结合GridView的案例:

首先是activity_main.xml文件:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:orientation="vertical"
  6. tools:context="com.himi.gridviewdemo.MainActivity" >
  7. <GridView
  8. android:id="@+id/gridview"
  9. android:layout_width="wrap_content"
  10. android:layout_height="wrap_content"
  11. android:columnWidth="90dp"
  12. android:numColumns="3"
  13. android:verticalSpacing="10dp"
  14. android:horizontalSpacing="10dp"
  15. android:stretchMode="columnWidth"
  16. android:gravity="center" />
  17. </LinearLayout>

其次是MainActivity.java:

  1. package com.himi.gridviewdemo;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.view.View;
  5. import android.widget.AdapterView;
  6. import android.widget.AdapterView.OnItemClickListener;
  7. import android.widget.GridView;
  8. import android.widget.Toast;
  9. public class MainActivity extends Activity {
  10. @Override
  11. protected void onCreate(Bundle savedInstanceState) {
  12. super.onCreate(savedInstanceState);
  13. setContentView(R.layout.activity_main);
  14. GridView gv = (GridView) findViewById(R.id.gridview);
  15. gv.setAdapter(new MyAdapter(MainActivity.this));
  16. gv.setOnItemClickListener(new OnItemClickListener() {
  17. public void onItemClick(AdapterView<?> parent, View view,
  18. int position, long id) {
  19. Toast.makeText(MainActivity.this, "imgs:" + position,
  20. Toast.LENGTH_LONG).show();
  21. }
  22. });
  23. }
  24. }

最后是MyAdapter.java:

  1. package com.himi.gridviewdemo;
  2. import android.content.Context;
  3. import android.view.View;
  4. import android.view.ViewGroup;
  5. import android.widget.BaseAdapter;
  6. import android.widget.FrameLayout.LayoutParams;
  7. import android.widget.GridView;
  8. import android.widget.ImageView;
  9. public class MyAdapter extends BaseAdapter { //所有的方法都要改写:包括getCount()、getItem()……
  10. private Context context;
  11. private Integer[] imgs = { R.drawable.imgs_00, R.drawable.imgs_01,
  12. R.drawable.imgs_02, R.drawable.imgs_03, R.drawable.imgs_04,
  13. R.drawable.imgs_05, R.drawable.imgs_06, R.drawable.imgs_07 };
  14. public MyAdapter(Context context) {//添加一个构造方法,传入参数为上下文Context,方便外界Activity调用
  15. this.context = context;
  16. }
  17. public int getCount() {
  18. // TODO 自动生成的方法存根
  19. return imgs.length;
  20. }
  21. public Object getItem(int position) {
  22. // TODO 自动生成的方法存根
  23. return position;
  24. }
  25. public long getItemId(int id) {
  26. // TODO 自动生成的方法存根
  27. return id;
  28. }
  29. public View getView(int position, View convertView, ViewGroup parent) {
  30. ImageView imageView;
  31. if (convertView == null) {
  32. imageView = new ImageView(context);
  33. imageView.setLayoutParams(new GridView.LayoutParams(225, 225));// 设置ImageView对象布局---宽高
  34. imageView.setAdjustViewBounds(false);// 设置边界对齐
  35. imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);// 设置刻度的类型
  36. imageView.setPadding(8, 8, 8, 8);// 设置间距
  37. } else {
  38. imageView = (ImageView) convertView;
  39. }
  40. imageView.setImageResource(imgs[position]);
  41. return imageView;
  42. }
  43. }

结果是如下图:

Android(java)学习笔记97:使用GridView以及重写BaseAdapter的更多相关文章

  1. Java学习笔记13---如何理解“子类重写父类方法时,返回值若为类类型,则必须与父类返回值类型相同或为其子类”

    子类重新实现父类的方法称重写:重写时可以修改访问权限修饰符和返回值,方法名和参数类型及个数都不可以修改:仅当返回值为类类型时,重写的方法才可以修改返回值类型,且必须是父类方法返回值的子类:要么就不修改 ...

  2. java学习笔记(十一):重写(Override)与重载(Overload)

    重写(Override) 重写是子类对父类的允许访问的方法的进行重新编写, 但是返回值和形参都不能改变. 实例 class Animal{ public void run(){ System.out. ...

  3. java学习笔记之基础篇

    java选择语句之switch   //switch可以用于等值判断 switch (e) //int ,或则可以自动转化成int 的类型,(byte char short)枚举jdk 7中可以防止字 ...

  4. 0028 Java学习笔记-面向对象-Lambda表达式

    匿名内部类与Lambda表达式示例 下面代码来源于:0027 Java学习笔记-面向对象-(非静态.静态.局部.匿名)内部类 package testpack; public class Test1{ ...

  5. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  6. Android动画学习笔记-Android Animation

    Android动画学习笔记-Android Animation   3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中 ...

  7. Java学习笔记:语言基础

    Java学习笔记:语言基础 2014-1-31   最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...

  8. Android 数字签名学习笔记

    Android 数字签名学习笔记 在Android系统中,所有安装到系统的应用程序都必有一个数字证书,此数字证书用于标识应用程序的作者和在应用程序之间建立信任关系,如果一个permission的pro ...

  9. java学习笔记01--数据类型

    java学习笔记01--数据类型 java数据类型划分 分为两大类型: 1)基本数据类型:类似于普通的值. 2)引用数据类型:传递的是内存的地址. 浮点类型实际上就是表示小数. java基本数据类型 ...

  10. 【Java学习笔记之二十六】深入理解Java匿名内部类

    在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...

随机推荐

  1. nginx安装及高可用

    nginx的安装: server1: tar zxf nginx-1.14.0.tar.gz cd nginx-1.14.0/src/core/ vim nginx.h cd /root/nginx- ...

  2. linux虚拟机管理

    1.虚拟机管理命令virsh-manager        ##开启虚拟机管理器 virsh list          ##显示正在运行的虚拟机virsh list  --all     ##查看所 ...

  3. Spring Boot学习资料汇总

    1. SpringFramework 重点学习 IOC容器,Web MVC framework,AOP 等    官网文档  http://docs.spring.io/spring/docs/cur ...

  4. Problem01 不死神兔

    题目:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 程序分析:兔子的规律为数列1,1,2,3,5,8,13,21 ...

  5. Linux用户登录信息

    1.用户登录日志信息 /var/run/utmp:记录当前正在登录系统的用户信息,默认由who和w记录当前登录用户的信息,uptime记录系统启动时间: /var/log/wtmp:记录当前正在登录和 ...

  6. java——编译和运行

    Java源代码---->编译器---->Java字节码(即虚拟指令..class文件.特殊的二进制文件.二进制字节码文件)---->jvm---->解释器(jvm的一部分)-- ...

  7. 标签li设为display inline-block后间距问题

    在对导航栏做水平排列的时候,我们往往对li元素设为display:inline-block 目的是为了,让所有li元素并排在一起,但是遇到个问题,我们的标签之间会产生空白边距 如图所示: 这样看上去, ...

  8. SQL---MySQL数据库---聚合函数

    1.数值 format(x,n) 将x格式化为  由逗号分隔,小数点后n 位的数:

  9. DRF-->1 序列化组件的使用和接口设计---get

    定义序列化器(本质就是一个类),一般包括模型类的字段,有自己的字段类型规则.实现了序列化器后,就可以创建序列化对象以及查询集进行序列化操作,通过序列化对象.data来获取数据(不用自己构造字典,再返回 ...

  10. [转]LazyLoad.js及scrollLoading.js

    本文转自:http://blog.csdn.net/ning109314/article/details/7042829 目前图片延迟加载主要分两大块,一是触发加载(根据滚动条位置加载图片):二是自动 ...