您的位置:首页 > 移动开发 > Android开发

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

2017-03-08 10:49 330 查看

RecylerView

高度自定义化的onClick事件,能够在viewHolder创建的时候为view设置监听器,通过view.setTag的方式,把dataList里面的值或者position传入view中绑定,再在监听器实现中,获取参数并回调相应的接口,并通过自定义的接口回传给外部的activity。

layoutManager的灵活使用,支持水平线性滑动,以及瀑布流形式。

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、对不同的状态进行处理:

分批加载数据,只关心静止状态:关心最后一个可见的条目,如果最后一个可见条目就是数据适配器(集合)里的最后一个,此时可加载更多的数据。在每次加载的时候,计算出滚动的数量,当滚动的数量大于等于总数量的时候,可以提示用户无更多数据了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: