Android高级学习之RecylerView和ListView的区别

来源:互联网 发布:骏域网络怎么样 编辑:程序博客网 时间:2024/04/29 10:47

RecylerView

  1. 高度自定义化的onClick事件,能够在viewHolder创建的时候为view设置监听器,通过view.setTag的方式,把dataList里面的值或者position传入view中绑定,再在监听器实现中,获取参数并回调相应的接口,并通过自定义的接口回传给外部的activity。
  2. layoutManager的灵活使用,支持水平线性滑动,以及瀑布流形式。
  3. ItemAnimator支持多种item添加以及删除动画,更好的交互效果

listView:

优:
1. OnItemClickListener
对item的点击事件能够很快相应,实现简单。
2. CursorAdapter
游标适配器能很方便与item数据绑定。
3. 能够在xml中轻松定义divider
缺:
1. item的动画,decoration与触摸交互实现起来困难

动态修改ListView

只需要调用Adapte的notifyDataChanged()方法,通知ListView更改数据源即可完成对ListView的动态修改(传进Adpater的需要是同一种数据)

ListView滑动监听

可以通过监听View的监听事件OnTouchListener中的事件发生坐标来做相应的处理:

listView.setOnTouchListener(new View.OnTouchListener() {            @Override            public boolean onTouch(View view, MotionEvent motionEvent) {                switch(motionEvent.getAction()){                    case MotionEvent.ACTION_DOWN:                        //触摸时操作                        Toast.makeText(ImgListActivity.this,"触摸",Toast.LENGTH_SHORT).show();                        break;                    case MotionEvent.ACTION_MOVE:                        //移动时操作                        Toast.makeText(ImgListActivity.this,"移动",Toast.LENGTH_SHORT).show();                        break;                    case MotionEvent.ACTION_UP:                        //离开时操作                        Toast.makeText(ImgListActivity.this,"离开",Toast.LENGTH_SHORT).show();                        break;                }                return false;            }        });

另外还可以用AbsListView中的OnScrollListener来进行监听,封装了很多与ListView相关的信息,用起来更加灵活。

/AbsListView的onScrollListener        listView.setOnScrollListener(new AbsListView.OnScrollListener() {            //一般在此方法中设置Flag,标志状态,方便其他方法处理            @Override            public void onScrollStateChanged(AbsListView absListView, int i) {                switch(i){                    case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:                        //活动停止时                        Toast.makeText(ImgListActivity.this,"滑动停止",Toast.LENGTH_SHORT).show();                        break;                    case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:                        //正在滑动时                        Toast.makeText(ImgListActivity.this,"滑动停止",Toast.LENGTH_SHORT).show();                        break;                    case AbsListView.OnScrollListener.SCROLL_STATE_FLING:                        //用力滑动时                        Toast.makeText(ImgListActivity.this,"用力滑动",Toast.LENGTH_SHORT).show();                        break;                }            }            @Override            public void onScroll(AbsListView absListView, int i, int i1, int i2) {                //滑动时一直调用,可以根据后几个参数判断上滑还是下滑            }        });

具有弹性的ListView

增加HeaderView或嵌套ScrollView,最简单的是重写ListView中的overScrollBy()方法,将maxOverScrollY参数修改成我们自己的就行了。为了适配分辨率问题,可以通过屏幕的density来计算具体的值,让不同分辨率的弹性基本保持一致:

//适配屏幕距离    private int mMaxOverScrollY;    private void initDensity(Context context) {        DisplayMetrics metrics = context.getResources().getDisplayMetrics();        float density = metrics.density;        mMaxOverScrollY = (int) (density * mMaxOverScrollY);    }

自动显示、隐藏ListView

借助View的OnTouchListener接口来监听ListView的滑动,接着通过比较上次的坐标大小来判断上滑还是下滑。另外,为避免第一个item被ToolBar遮挡,首先要给ListView增加一个HeaderView:

//添加HeaderView        View header = new View(this);        header.setLayoutParams(new AbsListView.LayoutParams(AbsListView.LayoutParams.MATCH_PARENT,getActionBar().getHeight()));        listView.addHeaderView(header);        //判断滑动距离        listView.setOnTouchListener(new View.OnTouchListener() {            private float mFirstY;            private float mCurrentY;            private boolean mShow;            private int drection;            //获取系统默认的最低滑动距离            int touchSlop = ViewConfiguration.get(this).getScaledTouchSlop();            @Override            public boolean onTouch(View view, MotionEvent motionEvent) {                switch(motionEvent.getAction()){                    case MotionEvent.ACTION_DOWN:                        //触摸时操作                        mFirstY = motionEvent.getY();                        break;                    case MotionEvent.ACTION_MOVE:                        //移动时操作                        mCurrentY = motionEvent.getY();                        if((mCurrentY-mFirstY)>touchSlop){                            //下滑                            drection=0;                        }else if((mFirstY-mCurrentY)>touchSlop){                        //上滑                        drection=1;                    }                        if(drection == 1){                            //隐藏                            if(mShow) {                                toolbarAnim(0);                                mShow = !mShow;                            }                        }else if(drection == 0){                            //显示                            if(!mShow){                                toolbarAnim(1);                                mShow = !mShow;                            }                        }                        break;                    case MotionEvent.ACTION_UP:                        //离开时操作                        Toast.makeText(ImgListActivity.this,"离开",Toast.LENGTH_SHORT).show();                        break;                }                return false;            }        });

ListView的优化

几种常用的Adapter:

 ArrayAdapter:简单易用的Adapter,通常用于数组或list集合的数据源(多个值包装成多个列表项)。 simpleAdapter:并不见得、功能强大的Adapter,可用于list集合的多个对象包装成多个列表项。 simpleCursorAdapter:与上相似,但是用于包装jCursor(数据库游标)提供的数据源。  BaseAdapter:通常用于被扩展。扩展BaseAdapter可以对各列表项进行最大限度的定制。

优化

一:使用convertView使用,listivew每次滚动都会调用gitview()方法,主要优化加载布局问题,
二:使用内部类ViewHolder新增加内部类ViewHolder,用于对控件的实力存储进行缓存,主要优化加载控件
三:google推荐优化,1+2实现
四:item布局不宜过深
五:对ListView中数据的分批及分页加载:
需求:ListView有一万条数据,如何显示;如果将十万条数据加载到内存,很消耗内存
解决办法:
优化查询的数据:先获取几条数据显示到界面上
进行分批处理—à优化了用户体验
进行分页处理—à优化了内存空间
说明:
一般数据都是从数据库中获取的,实现分批(分页)加载数据,就需要在对应的DAO中有相应的分批(分页)获取数据的方法,如findPartDatas ()
1、准备数据:
在dao中添加分批加载数据的方法:findPartDatas ()
在适配数据的时候,先加载第一批的数据,需要加载第二批的时候,设置监听检测何时加载第二批
2、设置ListView的滚动监听器:setOnScrollListener(new OnScrollListener{….})
①、在监听器中有两个方法:滚动状态发生变化的方法(onScrollStateChanged)和listView被滚动时调用的方法(onScroll)
②、在滚动状态发生改变的方法中,有三种状态:
手指按下移动的状态: SCROLL_STATE_TOUCH_SCROLL: // 触摸滑动
惯性滚动(滑翔(flgin)状态): SCROLL_STATE_FLING: // 滑翔
静止状态: SCROLL_STATE_IDLE: // 静止
3、对不同的状态进行处理:
分批加载数据,只关心静止状态:关心最后一个可见的条目,如果最后一个可见条目就是数据适配器(集合)里的最后一个,此时可加载更多的数据。在每次加载的时候,计算出滚动的数量,当滚动的数量大于等于总数量的时候,可以提示用户无更多数据了。

0 0
原创粉丝点击