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; }