Android(java)学习笔记97:使用GridView以及重写BaseAdapter
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相关推荐
- java/android 设计模式学习笔记(1)--- 单例模式
前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...
- Android Studio --- [学习笔记]TCP(第2弹)、GridView、ScrollView
说明 这篇主要接上一篇Android Studio - > [学习笔记]RadioButton.CheckBox.ImageView.ListView.TCP的三次握手 对上面回答的细解,并用J ...
- java/android 设计模式学习笔记(6)---适配器模式
这篇来介绍一下适配器模式(Adapter Pattern),适配器模式在开发中使用的频率也是很高的,像 ListView 和 RecyclerView 的 Adapter 等都是使用的适配器模式.在我 ...
- java/android 设计模式学习笔记(8)---桥接模式
这篇博客我们来介绍一下桥接模式(Bridge Pattern),它也是结构型设计模式之一.桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯或者使用,桥接模式的作用就是为被分离了的抽象部分 ...
- java/android 设计模式学习笔记(1)---单例模式
前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使 ...
- java/android 设计模式学习笔记(3)---工厂方法模式
这篇来介绍一下工厂方法模式(Factory Method Pattern),在实际开发过程中我们都习惯于直接使用 new 关键字用来创建一个对象,可是有时候对象的创造需要一系列的步骤:你可能需要计算或 ...
- java/android 设计模式学习笔记(7)---装饰者模式
这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是 ...
- Android Binder 学习笔记
前言: Binder是Android给我们提供的一种跨进程通信方式.理解Binder能帮助我们更好的理解Android的系统设计,比如说四大组件,AMS,WMS等系统服务的底层通信机制就都是基于Bin ...
- Android:日常学习笔记(8)———探究UI开发(5)
Android:日常学习笔记(8)---探究UI开发(5) ListView控件的使用 ListView概述 A view that shows items in a vertically scrol ...
- Android Studio --- [学习笔记]RadioButton、CheckBox、ImageView、ListView、TCP的三次握手
说明 源代码 在2.x里有TCP的三次挥手与四次握手,先对它进行简单的回答(百度).预计在下一篇里,会继续说明TCP 接上一篇: Android Studio - > [学习笔记]Button. ...
最新文章
- mysql ERROR 1045
- 019_html超链接
- Python 【抖音】短视频的自动上传与发布实例演示,同时支持快手、哔哩哔哩、小红书、微视、西瓜视频、微信视频号等平台的视频自动化同步发布
- C++Primer再学习(3)
- centos环境下使用percona-xtrabackup对mysql5.6数据库innodb和myisam进行快速备份及恢复...
- php检测数组类型,javascript中通过哪些方法来检测数组类型?
- 海洋知识科普相关调研
- java鸟和翅膀组合关系怎么写_关联、聚合、组合和依赖之间区别
- mysql 视图锁_Oracle数据库的锁类型及相关视图
- 小数乘分数怎么算过程_广东新高考分数怎么算
- ExtJs 4.x MVC 架构
- Pytorch中的torch.nn.Embedding()
- MultiThread
- 内存测试软件 ddr 4,DDR4内存理论性能测试
- 做短视频自媒体,常用工具和素材网站分享,新手小白收藏抓紧行动
- ⑦企业级zabbix监控 微信报警、邮箱报警、钉钉报警、全网最细
- wps怎么减少行间距,WPS的word怎么不能缩小行间距
- 少儿编程中项目式学习的创造性
- Multisim实现JK触发器时钟信号分频
- Linux ASPM 问题一个适合的解决方案
热门文章
- mysql提供的六种约束_MySQL中的六个约束
- top 100 liked Q (26-)
- python中self和cls的区别
- 使用python实现日志功能
- IDEA+MAVEN+testNG(reportNG)
- hdu5033 Building 单调队列
- codeforces 584E Anton and Ira [想法题]
- .NET后台如何获取前台HMTL控件的值
- IOS学习之路十(仿人人滑动菜单Slide-out Sidebar Menu)
- 命令前加./ ,在后台运行程序 linux批处理 linux自动运行程序