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对象。

class MyAdapter extends BaseAdapter{private Context context;public MyAdapter(Context context){this.context = context;}@Overridepublic int getCount() {//在此适配器中所代表的数据集中的条目数return 0;}@Overridepublic Object getItem(int position) {// 获取数据集中与指定索引对应的数据项return null;}@Overridepublic long getItemId(int position) {//取在列表中与指定索引对应的行idreturn 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// Get a View that displays the data at the specified position in the data set.return null;}}

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

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

@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View item = mInflater.inflate(R.layout.list_item, null);ImageView img = (ImageView)item.findViewById(R.id.img) TextView title = (TextView)item.findViewById(R.id.title);TextView info = (TextView)item.findViewById(R.id.info);img.setImageResource(R.drawable.ic_launcher);title.setText("Hello");info.setText("world");return item;}

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

public View getView(int position, View convertView, ViewGroup parent) {if(convertView == null){convertView = mInflater.inflate(R.layout.list_item, null);}ImageView img = (ImageView)convertView.findViewById(R.id.img) TextView title = (TextView)convertView.findViewById(R.id.title);TextView info = (TextView)ConvertView.findViewById(R.id.info);img.setImageResource(R.drawable.ic_launcher);title.setText("Hello");info.setText("world");return convertView;}

第三种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。

//在外面先定义,ViewHolder静态类static class ViewHolder{public ImageView img;public TextView title;public TextView info;}
//然后重写getView
        @Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder holder;if(convertView == null){holder = new ViewHolder();convertView = mInflater.inflate(R.layout.list_item, null);holder.img = (ImageView)item.findViewById(R.id.img) holder.title = (TextView)item.findViewById(R.id.title);holder.info = (TextView)item.findViewById(R.id.info);convertView.setTag(holder);}else{holder = (ViewHolder)convertView.getTag();holder.img.setImageResource(R.drawable.ic_launcher);holder.title.setText("Hello");holder.info.setText("World");}return convertView;}

2. BaseAdapter结合GridView的案例:

首先是activity_main.xml文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context="com.himi.gridviewdemo.MainActivity" ><GridViewandroid:id="@+id/gridview"android:layout_width="wrap_content"android:layout_height="wrap_content"android:columnWidth="90dp"android:numColumns="3"android:verticalSpacing="10dp"android:horizontalSpacing="10dp"android:stretchMode="columnWidth"android:gravity="center"   /></LinearLayout>

其次是MainActivity.java:

package com.himi.gridviewdemo;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.Toast;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);GridView gv = (GridView) findViewById(R.id.gridview);gv.setAdapter(new MyAdapter(MainActivity.this));gv.setOnItemClickListener(new OnItemClickListener() {public void onItemClick(AdapterView<?> parent, View view,int position, long id) {Toast.makeText(MainActivity.this, "imgs:" + position,Toast.LENGTH_LONG).show();}});}}

最后是MyAdapter.java:

package com.himi.gridviewdemo;import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.FrameLayout.LayoutParams;
import android.widget.GridView;
import android.widget.ImageView;public class MyAdapter extends BaseAdapter {  //所有的方法都要改写:包括getCount()、getItem()……private Context context;private Integer[] imgs = { R.drawable.imgs_00, R.drawable.imgs_01,R.drawable.imgs_02, R.drawable.imgs_03, R.drawable.imgs_04,R.drawable.imgs_05, R.drawable.imgs_06, R.drawable.imgs_07 };public MyAdapter(Context context) {//添加一个构造方法,传入参数为上下文Context,方便外界Activity调用this.context = context;}public int getCount() {// TODO 自动生成的方法存根return imgs.length;}public Object getItem(int position) {// TODO 自动生成的方法存根return position;}public long getItemId(int id) {// TODO 自动生成的方法存根return id;}public View getView(int position, View convertView, ViewGroup parent) {ImageView imageView;if (convertView == null) {imageView = new ImageView(context);imageView.setLayoutParams(new GridView.LayoutParams(225, 225));// 设置ImageView对象布局---宽高imageView.setAdjustViewBounds(false);// 设置边界对齐imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);// 设置刻度的类型imageView.setPadding(8, 8, 8, 8);// 设置间距
} else {imageView = (ImageView) convertView;}imageView.setImageResource(imgs[position]);return imageView;}}

结果是如下图:

转载于:https://www.cnblogs.com/hebao0514/p/4730506.html

Android(java)学习笔记97:使用GridView以及重写BaseAdapter相关推荐

  1. java/android 设计模式学习笔记(1)--- 单例模式

    前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...

  2. Android Studio --- [学习笔记]TCP(第2弹)、GridView、ScrollView

    说明 这篇主要接上一篇Android Studio - > [学习笔记]RadioButton.CheckBox.ImageView.ListView.TCP的三次握手 对上面回答的细解,并用J ...

  3. java/android 设计模式学习笔记(6)---适配器模式

    这篇来介绍一下适配器模式(Adapter Pattern),适配器模式在开发中使用的频率也是很高的,像 ListView 和 RecyclerView 的 Adapter 等都是使用的适配器模式.在我 ...

  4. java/android 设计模式学习笔记(8)---桥接模式

    这篇博客我们来介绍一下桥接模式(Bridge Pattern),它也是结构型设计模式之一.桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯或者使用,桥接模式的作用就是为被分离了的抽象部分 ...

  5. java/android 设计模式学习笔记(1)---单例模式

    前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...

  6. java/android 设计模式学习笔记(3)---工厂方法模式

    这篇来介绍一下工厂方法模式(Factory Method Pattern),在实际开发过程中我们都习惯于直接使用 new 关键字用来创建一个对象,可是有时候对象的创造需要一系列的步骤:你可能需要计算或 ...

  7. java/android 设计模式学习笔记(7)---装饰者模式

    这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是 ...

  8. Android Binder 学习笔记

    前言: Binder是Android给我们提供的一种跨进程通信方式.理解Binder能帮助我们更好的理解Android的系统设计,比如说四大组件,AMS,WMS等系统服务的底层通信机制就都是基于Bin ...

  9. Android:日常学习笔记(8)———探究UI开发(5)

    Android:日常学习笔记(8)---探究UI开发(5) ListView控件的使用 ListView概述 A view that shows items in a vertically scrol ...

  10. Android Studio --- [学习笔记]RadioButton、CheckBox、ImageView、ListView、TCP的三次握手

    说明 源代码 在2.x里有TCP的三次挥手与四次握手,先对它进行简单的回答(百度).预计在下一篇里,会继续说明TCP 接上一篇: Android Studio - > [学习笔记]Button. ...

最新文章

  1. mysql ERROR 1045
  2. 019_html超链接
  3. Python 【抖音】短视频的自动上传与发布实例演示,同时支持快手、哔哩哔哩、小红书、微视、西瓜视频、微信视频号等平台的视频自动化同步发布
  4. C++Primer再学习(3)
  5. centos环境下使用percona-xtrabackup对mysql5.6数据库innodb和myisam进行快速备份及恢复...
  6. php检测数组类型,javascript中通过哪些方法来检测数组类型?
  7. 海洋知识科普相关调研
  8. java鸟和翅膀组合关系怎么写_关联、聚合、组合和依赖之间区别
  9. mysql 视图锁_Oracle数据库的锁类型及相关视图
  10. 小数乘分数怎么算过程_广东新高考分数怎么算
  11. ExtJs 4.x MVC 架构
  12. Pytorch中的torch.nn.Embedding()
  13. MultiThread
  14. 内存测试软件 ddr 4,DDR4内存理论性能测试
  15. 做短视频自媒体,常用工具和素材网站分享,新手小白收藏抓紧行动
  16. ⑦企业级zabbix监控 微信报警、邮箱报警、钉钉报警、全网最细
  17. wps怎么减少行间距,WPS的word怎么不能缩小行间距
  18. 少儿编程中项目式学习的创造性
  19. Multisim实现JK触发器时钟信号分频
  20. Linux ASPM 问题一个适合的解决方案

热门文章

  1. mysql提供的六种约束_MySQL中的六个约束
  2. top 100 liked Q (26-)
  3. python中self和cls的区别
  4. 使用python实现日志功能
  5. IDEA+MAVEN+testNG(reportNG)
  6. hdu5033 Building 单调队列
  7. codeforces 584E Anton and Ira [想法题]
  8. .NET后台如何获取前台HMTL控件的值
  9. IOS学习之路十(仿人人滑动菜单Slide-out Sidebar Menu)
  10. 命令前加./ ,在后台运行程序 linux批处理 linux自动运行程序