ListView 优化:
1:复用contentView 优化布局,(if contentView==null){}else{}
2:ViewHolder(不需要每次都findViewById)(setTag getTAg)
3:分页加载数据,滑动中不加载图片.
ListView
1 adapter 继承BaseAdapter
2自定义ViewHolder
3分割线用divider设置
4 点击事件
5 addHeadView addFootView
RecycleView
1:adapter 继承RecycleView.Adapter<>
2:ViewHolder 必须继承RecycleView.ViewHolder
3:setadapter 设置样式
new LinearLayoutManager(this) ; -> 表示ListView
new GridLayoutManager(this , 3) ; -> 表示GridView,3表示1列显示的个数
new StraggeredGridLayoutManager() 可以支持交叉网格风格的列表,类似于瀑布流或者Pinterest。
4:RecyclerView不支持直接在布局中添加分割线
5:RecyclerView不支持点击事件,没有addHeadView addFootView()只能用回调接口来设置点击事件
6:RecyclerView.ItemAnimator则被提供用于在RecyclerView添加、删除或移动item时处理动画效果。
ListView判断是否滑动到顶部
private boolean scrollFlag = false;// 标记是否滑动
private int lastVisibleItemPosition;// 标记上次滑动位置
listview.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView absListView, int scrollState) {
if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
scrollFlag = true;//滑动
} else {
scrollFlag = false;//没滑动
}
}
@Override
public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (scrollFlag) {
if (firstVisibleItem > lastVisibleItemPosition) {
//滑动后的第一个item > 标记上次滑动位置 (ps : 3>2)
Log.e(TAG, "上滑");
}
if (firstVisibleItem < lastVisibleItemPosition) {
Log.e(TAG, "下滑");
}
if (firstVisibleItem == lastVisibleItemPosition) {
return;
}
//滑动后位置
lastVisibleItemPosition = firstVisibleItem;
}
if (firstVisibleItem == 0) {
Log.e(TAG, "onScroll: 到达顶部");
} else if (firstVisibleItem + visibleItemCount == totalItemCount) {
Log.e(TAG, "onScroll: 到底底部");
}
}
});
RecycleView 是否滑动到顶部和底部
newState: -1 顶部 0停止 1底部 2滚动
第一种
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
// 静止 -> 被迫拖拽移动 -> 静止
// 静止 -> 被迫拖拽移动 -> 自己滚动 -> 静止
// 目前的状态 newState: 0 ,1,2
// 0: 停止
// 1:
// 2: 自己滚动
Log.e(TAG, "onScrollStateChanged: newState="+newState );
boolean b =recyclerView.canScrollVertically(newState);
Log.e(TAG, "onScrollStateChanged: b="+b );
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
// dx : 水平滚动距离
// dy : 垂直滚动距离
// 1: false : 滑动到底部
// true: 没滑动到底部
if(recyclerView.canScrollVertically(1)){
Log.e(TAG, "direction 1: true");
}else {
Log.e(TAG, "direction 1: false"+"滑动到底部");//
}
// -1: false : 滑动到顶部
// true: 没滑动到顶部
if(recyclerView.canScrollVertically(-1)){
Log.e(TAG, "direction -1: true");
}else {
Log.e(TAG, "direction -1: false"+"滑动到顶部");//
}
}
});
第二种:
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
Log.i(TAG, "--------------------------------------");
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
int firstCompletelyVisibleItemPosition = layoutManager.findFirstCompletelyVisibleItemPosition();
Log.i(TAG, "firstCompletelyVisibleItemPosition: "+firstCompletelyVisibleItemPosition);
if(firstCompletelyVisibleItemPosition==0)
Log.i(TAG, "滑动到顶部");
int lastCompletelyVisibleItemPosition = layoutManager.findLastCompletelyVisibleItemPosition();
Log.i(TAG, "lastCompletelyVisibleItemPosition: "+lastCompletelyVisibleItemPosition);
if(lastCompletelyVisibleItemPosition==layoutManager.getItemCount()-1)
Log.i(TAG, "滑动到底部");
}
});