Android关于listView的BaseAdapter以及三级优化

来源:互联网 发布:python数据科学入门 编辑:程序博客网 时间:2024/06/05 10:21

自定义Adapter继承自BaseAdapter(通用适配器)

1:4个重写方法的含义  

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 ;

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

0 0
原创粉丝点击