Android关于listView的BaseAdapter以及getView的三级优化
1、4个重写方法的含义
自定义Adapter继承自BaseAdapter(通用适配器)
getCount();
getItem();
getItemId();
getViewTypaCount();
2:getView的三级缓存优化写法
一级优化:使用converView进行view的复用
二级优化:将convertView的所有findviewById操作的控件缓存起来--ViewHolder
三级优化:一次适配的数据源list集合是有限的(分批加载...)
3:ListView中convertView和ViewHolder的工作原理
参考:
http://blog.csdn.net/bill_ming/article/details/8817172
4:常用优化技巧
使用viewHolder模式提高效率
设置项目分隔线
隐藏ListView的滚动条
取消ListView的Item点击效果
------当点击Listview中的某一项时,系统默认会出现一个点击效果,在5.0上是一个波纹效果,5.0下则是一个
改变背景颜色的效果,通常情况下,我们会选择取消点击后的回馈效果 listSelector=“#00000000”
设置Listview需要显示在第几项
-------Listview是以Item为单位进行显示,默认显示在第一个Item,当需要指定具体显示的item时,setSelection(N)....
这个方法是瞬间完成的移动,除此之外,还可以使用如下代码来完成平滑移动。
mListview.smoothScrollBy(distance,duration);
mListView.smoothScrollByOffset(offset);
mListView.smoothScrollToPosition(index);
遍历ListView中的所有Item
getChildCount()
getChildAt()
5:listView滑动监听(下拉刷新,上拉加载)
ListView的滑动监听,是ListView中最重要的技巧,很多重写的ListView,基本都是在滑动事件的处理上下功夫:
这里介绍2种监听ListView滑动事件的方法:
(1)、onTouchListener:View中的监听事件,通过监听ACTION_DOWN,ACTION_MOVE,ACTION_UP这3个事件发生时的坐标,
就可以根据坐标判断 用户滑动的方向,并在不同的事件中进行相应的处理;
(2)、onScrollListener:是AbsListView中的监听事件,它封装了很多与ListView相关的信息,使用起来更加灵活。
OnscrollListener.SCROLL_STATE_IDLE: 滚动停止时;
OnScrollListener.SCROLL_STATE_TOUCH_SCROLL: 正在滚动
OnScrollListener.SCROLL_STATE_FLING: 猛的一滑,在 手指离开后,由于惯性继续滑动
onScroll方法:
firstVisbleItem: 当前能看见的第一个Item的ID;
visbleItemCount: 当前能看见的Item总数,包括没有显示完整的Item;
totalItemCount: 整个ListView的Item总数;
--->应用: 判断是否滚动到最后一行,进行分批数据加载并自动刷新数据;
--->判断滚动到最后一行:firstVisbleItem+visbleItemCount == totalItemCount ;
Eg:
public class InforAdapter extends BaseAdapter {
List<Infor> inforlist = new ArrayList<>();
Context context;
public InforAdapter(List<Infor> inforlist,Context context) {
this.context=context;
this.inforlist = inforlist;
}
@Override
public int getCount() {
return inforlist == null ? 0 : inforlist.size();
}
public void fluhData(List<Infor> inforlist) {
this.inforlist = inforlist;
//通知adapter刷新数据
this.notifyDataSetChanged();
}
@Override
public Object getItem(int position) {
return inforlist.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
Infor infor = inforlist.get(position);
int infortype = infor.getType();
return infortype;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final IvViewHolder ivViewHolder;
final TvViewHolder tvViewHolder;
final Infor infor = inforlist.get(position);
int ViewType = getItemViewType(position);
if (ViewType == 0) {
// 只显示图片的item;
if (convertView == null) {
convertView = View.inflate(parent.getContext(), R.layout.iv_infor, null);
ivViewHolder = new IvViewHolder();
ivViewHolder.iv = (ImageView) convertView.findViewById(R.id.iv_content);
ivViewHolder.title = (TextView) convertView.findViewById(R.id.title);
ivViewHolder.iv_icon = (ImageView) convertView.findViewById(R.id.title_icon);
ivViewHolder.source = (TextView) convertView.findViewById(R.id.source);
ivViewHolder.guanzhu = (TextView) convertView.findViewById(R.id.guanzhu);
ivViewHolder.guanzhu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(ivViewHolder.guanzhu.getText().equals("关注")){
ivViewHolder.guanzhu.setText("已关注");
ivViewHolder.guanzhu.setTextColor(Color.parseColor("#EA2000"));
}else if(ivViewHolder.guanzhu.getText().equals("已关注")) {
ivViewHolder.guanzhu.setText("关注");
ivViewHolder.guanzhu.setTextColor(Color.parseColor("#000000"));
Toast.makeText(context,"已取消关注",Toast.LENGTH_SHORT).show();
}
}
});
convertView.setTag(ivViewHolder);
} else {
ivViewHolder = (IvViewHolder) convertView.getTag();
}
ivViewHolder.title.setText(infor.getTitle());
ivViewHolder.iv.setImageResource(infor.getImgid());
ivViewHolder.guanzhu.setText("关注");
ivViewHolder.guanzhu.setTextColor(Color.parseColor("#000000"));
ivViewHolder.source.setText(infor.getSource());
ivViewHolder.iv_icon.setImageResource(infor.getIconid());
} else if (ViewType == 1) {
// 只显示文字的Item;
if (convertView == null) {
convertView = View.inflate(parent.getContext(), R.layout.tv_infor, null);
tvViewHolder = new TvViewHolder();
tvViewHolder.tv = (TextView) convertView.findViewById(R.id.tv_content);
tvViewHolder.title = (TextView) convertView.findViewById(R.id.title);
tvViewHolder.iv_icon = (ImageView) convertView.findViewById(R.id.title_icon);
tvViewHolder.source = (TextView) convertView.findViewById(R.id.source);
tvViewHolder.guanzhu = (TextView) convertView.findViewById(R.id.guanzhu);
tvViewHolder.guanzhu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(tvViewHolder.guanzhu.getText().equals("关注")){
tvViewHolder.guanzhu.setText("已关注");
tvViewHolder.guanzhu.setTextColor(Color.parseColor("#EA2000"));
}else if(tvViewHolder.guanzhu.getText().equals("已关注")){
tvViewHolder.guanzhu.setText("关注");
tvViewHolder.guanzhu.setTextColor(Color.parseColor("#000000"));
Toast.makeText(context,"已取消关注",Toast.LENGTH_SHORT).show();
}
}
});
convertView.setTag(tvViewHolder);
} else {
tvViewHolder = (TvViewHolder) convertView.getTag();
}
tvViewHolder.guanzhu.setText("关注");
tvViewHolder.guanzhu.setTextColor(Color.parseColor("#000000"));
tvViewHolder.title.setText(infor.getTitle());
tvViewHolder.tv.setText(infor.getContent());
tvViewHolder.iv_icon.setImageResource(infor.getIconid());
tvViewHolder.source.setText(infor.getSource());
}
return convertView;
}
static class IvViewHolder {
ImageView iv;
ImageView iv_icon;
TextView source;
TextView title;
TextView guanzhu;
}
static class TvViewHolder {
TextView title;
ImageView iv_icon;
TextView source;
TextView guanzhu;
TextView tv;
}
Android关于listView的BaseAdapter以及getView的三级优化的更多相关文章
- 43.Android之ListView中BaseAdapter学习
实际开发中个人觉得用的比较多是BaseAdapter,尽管使用起来比其他适配器有些麻烦,但是使用它却能实现很多自己喜欢的列表布局,比如ListView.GridView.Gallery.Spinner ...
- Android杂谈--ListView之BaseAdapter的使用
话说开发用了各种Adapter之后感觉用的最舒服的还是BaseAdapter,尽管使用起来比其他适配器有些麻烦,但是使用它却能实现很多自己喜欢的列表布局,比如ListView.GridView.Gal ...
- android 分享一个处理BaseAdapter,getView()多次加载的方法
一:BaseAdapter介绍 BaseAdapter是listview,gridview等列表,使用的数据适配器,它的主要用途是将一组数据传到ListView.Spinner.Gallery及Gri ...
- Android 杂谈---ListView 之BaseAdapter
前言 几种适配器里面相对来说比较简单的一种适配器,在使用时需要实现几个方法,并且也需要对convertView进行优化 此篇文章以使用listView与BaseAdapter来实现表格样式的布局举例( ...
- [转]Android杂谈--ListView之BaseAdapter的使用
本文转自:http://blog.csdn.net/tianshuguang/article/details/7344315 话说开发用了各种Adapter之后感觉用的最舒服的还是BaseAdapte ...
- android 中listview之BaseAdapter的使用
Listview控件不像其他安卓控件那种直接拖拽到界面上就能用,而是采用类似J2EE中的MVC模型的方式使用,需要通过适配器将某种样式的数据或控件添加到其上而使用. MVC模型实现原理是 数据模型M( ...
- Android中ListView通过BaseAdapter实现数据的绑定
1. public class ListFiles extends Activity { ListView Listview=null; protected void onCreate(Bundle ...
- Android使用listView,BaseAdapter实现列表页
参考: 1.讲解很详细: blog.csdn.net/psuaije/article/details/7447391 总结: 代码:
- 转--Android实现ListView过滤功能,继承于BaseAdapter,非ArrayAdapter。
其实实现ListView过滤功能最方便的便是使用ArrayAdapter,里面自带的getFilter()方法能很方便的实现此功能,但是在实际的开发中,一般都是继承于BaseAdapter.还有一种是 ...
随机推荐
- 挑子学习笔记:两步聚类算法(TwoStep Cluster Algorithm)——改进的BIRCH算法
转载请标明出处:http://www.cnblogs.com/tiaozistudy/p/twostep_cluster_algorithm.html 两步聚类算法是在SPSS Modeler中使用的 ...
- Linux CentOS7通过yum命令安装Mono(尝先安装模式)
前言 经过尝试网上各种安装mono的技术贴,这个安装过程经历了大约2周,尝试了各个版本,几目前博客所描述的所有安装方式.以下内容的安装方式可以为你尝试不同版本的mono.并非正式环境安装标准方式安装. ...
- 2000条你应知的WPF小姿势 基础篇<8-14>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师,对C#和WPF有着极深的热情.最为出色的是他维护了两个博客:2,000Things You Should Know ...
- salesforce 零基础学习(五十五)java通过SOAP方式定时访问某个文件然后插入到sObject中
项目源码:https://github.com/zhangyueqidlmu/SOAP-Access-SFDC.git 项目背景:salesforce端相关数据需要其他系统提供,其他系统可以提供相关数 ...
- 在thinkPHP3.2.3框架下实现手机和PC端浏览器的切换
查看thinkphp版本号方法 打开文件“根目录\ThinkPHP\ThinkPHP.php”下的文件ThinkPHP.php,在22--23行可以看到版本信息THINK_VERSION,如下图: 说 ...
- GitHub实战系列~1.环境部署+创建第一个文件 2015-12-9
GitHub实战系列汇总:http://www.cnblogs.com/dunitian/p/5038719.html ———————————————————————————————————————— ...
- iOS 支持 IPv6
苹果的规定:2016年6月1日提交到App Store必须支持IPv6-only网络. 官方文档:https://developer.apple.com/library/mac/documentati ...
- Log4net入门(ASP.NET MVC 5篇)
在前4篇Log4net入门文章中,我们讲述了log4net的一些简单用法,在这一篇中我们主要讲述如何在ASP.NET MVC 5项目中将日志信息写入SQL Server数据库中. 一.创建最简单的AS ...
- H5 Notes:Navigator Geolocation
H5的地理位置API可以帮助我们来获取用户的地理位置,经纬度.海拔等,因此我们可以利用该API做天气应用.地图服务等. Geolocation对象是我们获取地理位置用到的对象. 首先判断浏览器是否支持 ...
- jQuery的DOM操作实例(1)——选项卡&&Tab切换
一.原生JavaScript编写tab切换 二.jQuery编写tab切换 在用jQuery编写选项卡过程中,重要的事搞清楚 .eq() 和 .index() 的使用方法. .eq()是jQuery遍 ...