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

原地址:http://blog.csdn.net/lks1139230294/article/details/60762403


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;
            }
        });
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

另外还可以用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) {
                //滑动时一直调用,可以根据后几个参数判断上滑还是下滑

            }
        });
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

具有弹性的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);
    }
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

自动显示、隐藏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;
            }
        });
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

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、对不同的状态进行处理: 
分批加载数据,只关心静止状态:关心最后一个可见的条目,如果最后一个可见条目就是数据适配器(集合)里的最后一个,此时可加载更多的数据。在每次加载的时候,计算出滚动的数量,当滚动的数量大于等于总数量的时候,可以提示用户无更多数据了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值