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的三级优化的更多相关文章

  1. 43.Android之ListView中BaseAdapter学习

    实际开发中个人觉得用的比较多是BaseAdapter,尽管使用起来比其他适配器有些麻烦,但是使用它却能实现很多自己喜欢的列表布局,比如ListView.GridView.Gallery.Spinner ...

  2. Android杂谈--ListView之BaseAdapter的使用

    话说开发用了各种Adapter之后感觉用的最舒服的还是BaseAdapter,尽管使用起来比其他适配器有些麻烦,但是使用它却能实现很多自己喜欢的列表布局,比如ListView.GridView.Gal ...

  3. android 分享一个处理BaseAdapter,getView()多次加载的方法

    一:BaseAdapter介绍 BaseAdapter是listview,gridview等列表,使用的数据适配器,它的主要用途是将一组数据传到ListView.Spinner.Gallery及Gri ...

  4. Android 杂谈---ListView 之BaseAdapter

    前言 几种适配器里面相对来说比较简单的一种适配器,在使用时需要实现几个方法,并且也需要对convertView进行优化 此篇文章以使用listView与BaseAdapter来实现表格样式的布局举例( ...

  5. [转]Android杂谈--ListView之BaseAdapter的使用

    本文转自:http://blog.csdn.net/tianshuguang/article/details/7344315 话说开发用了各种Adapter之后感觉用的最舒服的还是BaseAdapte ...

  6. android 中listview之BaseAdapter的使用

    Listview控件不像其他安卓控件那种直接拖拽到界面上就能用,而是采用类似J2EE中的MVC模型的方式使用,需要通过适配器将某种样式的数据或控件添加到其上而使用. MVC模型实现原理是 数据模型M( ...

  7. Android中ListView通过BaseAdapter实现数据的绑定

    1. public class ListFiles extends Activity { ListView Listview=null; protected void onCreate(Bundle ...

  8. Android使用listView,BaseAdapter实现列表页

    参考: 1.讲解很详细: blog.csdn.net/psuaije/article/details/7447391 总结: 代码:

  9. 转--Android实现ListView过滤功能,继承于BaseAdapter,非ArrayAdapter。

    其实实现ListView过滤功能最方便的便是使用ArrayAdapter,里面自带的getFilter()方法能很方便的实现此功能,但是在实际的开发中,一般都是继承于BaseAdapter.还有一种是 ...

随机推荐

  1. 关于Java中进程和线程的详解

    一.进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命 周期.它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而 ...

  2. maven常见异常以及解决方法

    本文写的是我在整合ssm框架时遇到的一些问题,我估计很多人也会遇到,所以,这里作为一个总结,希望能够帮助大家解决问题 一,加入shiro组件时抛出的异常 加入步骤(略) 问题 1,保存后,无法导入sh ...

  3. 跨平台的 .NET 运行环境 Mono 3.2 新特性

    Mono 3.2 发布了,对 Mono 3.0 和 2.10 版本的支持不再继续,而且这两个分支也不再提供 bug 修复更新. Mono 3.2 主要新特性: LLVM 更新到 3.2 版本,带来更多 ...

  4. Mono 3.2.7发布,JIT和GC进一步改进

    Mono 3.2.7已经发布,带来了很多新特性,如改进的JIT.新的面向LINQ的解释器以及使用了64位原生指令等等. 这是一次主要特性发布,累积了大约5个月的开发工作.看上去大部分改进都是底层的性能 ...

  5. 【腾讯Bugly干货分享】微信终端跨平台组件 mars 系列(二) - 信令传输超时设计

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com/s/9DJxipJaaBC8yC-buHgnTQ 作者简介: ...

  6. 2000条你应知的WPF小姿势 基础篇<63-68 Triggers和WPF类逻辑结构>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000ThingsYou Should Know About C# 和 2,00 ...

  7. (转载)解决“Windows Update一直无法完成”的方法

    近日彻底重装系统,启动Win7的"Windows Update",程序显示在检查更新,却一直没有结果. 在排除网络问题,排除杀毒软件和防火墙的问题之后,感觉还是程序或者配置除了问题 ...

  8. 关于安卓6.0权限申请 PermissionDog

    最近在一家公司实习,项目中需要用到适配安卓6.0以上的系统,我本来是想用其他人已经写好的权限申请框架来实现的,但是发现跟我的需求有点小区别,所以就自己写了一个 这个权限申请的帮助类很小,只有一个jav ...

  9. SqlService过期的解决方案

    看图吧,不喜欢说话,图里面我都打备注了 0SQLService异常 1找到安装中心 2升级版本 3监测ing 4输入升级key 5同意并下一步 6下一步 7下一步 8下一步 9收工 10可以打开了

  10. 这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧

    注意:有网友提出部分项目停止更新的事情,这个问题我特意注意过,很多都是小功能组件,功能稳定,没有bug,没更新是正常的.够用就行了.其次技术支持的事情,对开源免费来说,不能太强求,这里发布的都是小功能 ...