一直用的ListView、最近才听别人说了一种控件RecyclerView,说是listView和gridview的升级版,就去研究了一下。把最简单的下拉刷新、上拉加载做出来了。本来研究这个东西,是想把侧滑删除,类似于QQ的效果做出来的,结果能力有限。
首先,recyclerview是v7包里面的,要是想用这个控件就先去晚上找jar包吧。我是直接用AS的在线导包。这里我用到了两个包。recyclerview的com.android.support:recyclerview-v7:23.2.0,还有一个是cardview的com.android.support:cardview-v7:23.2.0。因为recyclerview的分隔线还要自己划,真特么坑爹。不过我也写了,后面有。
这里我贴出主要代码,后面有项目安装包,下了看咯。反正不要积分。其实,我觉得recyclerview的用法跟listView是差不多的。都是拿数据,设置adapter。就是recyclerview多了几个方法。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = this;
initData();
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe);
verRecycler = (RecyclerView) findViewById(R.id.ver_recycle);
mLayoutManager = new LinearLayoutManager(context); //布局管理器
verRecycler.setLayoutManager(mLayoutManager);
// verRecycler.addItemDecoration(new MyVerDividerItemDecoration(context, MyVerDividerItemDecoration.VERTICAL_LIST)); //分隔线
MyRecyclerViewAdapter adapter = new MyRecyclerViewAdapter(mDatas, context);
verRecycler.setAdapter(adapter); //设置adapter
setOnRefresh(); //刷新
setLoadMore();//加载
}
这是oncreate方法。recyclerview要有一个布局管理器。因为,他不仅可以竖着变成listview,他还可以横着变成gridview。他有三个子类,我这里用的是其中一个LinearLayoutManager。下面分别给出刷新和到底加载的方法,我没有重写recyclerview,所以,没有什么头布局,脚布局。据说,写起来很麻烦。
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
if(isLoading){ //要刷新的时候,判断有没有在加载数据,如果在加载数据,就不让用户刷新
swipeRefreshLayout.setRefreshing(false);
Toast.makeText(context, "正在加载,请稍后刷新", Toast.LENGTH_SHORT).show();
return;
}
isRefresh = true;
swipeRefreshLayout.setRefreshing(true);
if(timer ==null) timer = new Timer();
if(timerTask==null) timerTask = new TimerTask() {
@Override
public void run() {
if (i == 0) {
handler.sendEmptyMessage(0x001);
} else {
handler.sendEmptyMessage(0x002);
}
}
};
i = 3;
timer.schedule(timerTask, 0, 1000);
}
});
刷新我用的是SwipeRefreshLayout。这是谷歌出的一个控件。用起来感觉还不错。我之前刷新加载都是用的PullToRefresh的第三方jar。不过这个我已经用习惯了,我还是觉得PullToRefresh好用一些。
verRecycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int lastVisibleItem = ((LinearLayoutManager) mLayoutManager).findLastVisibleItemPosition();
int totalItemCount = mLayoutManager.getItemCount();
Log.v("WZ", "dx:" + dx + "->" + "dy:" + dy);
Log.v("WZ", "lastVisibleItem:" + lastVisibleItem + "->" + "totalItemCount:" + totalItemCount);
if (lastVisibleItem == totalItemCount - 4 && dy > 0) {
if (isRefresh) { //到加载数据的时候,先判断有没有在刷新,如果在刷新就不让他加载
Toast.makeText(context, "正在刷新,请稍后加载", Toast.LENGTH_SHORT).show();
return;
}
if (isLoading) {
Toast.makeText(context, "正在加载,请稍后...", Toast.LENGTH_SHORT).show();
} else {
isLoading = true;
}
}
}
});
到底自动加载。这个应该见到很多遍了。没什么好说的。下面给出画线的工具类。
/**
* RecyclerView画横向分隔线
*
* Created by BML-KF on 2016/4/15.
*/
public class MyVerDividerItemDecoration extends RecyclerView.ItemDecoration{
private int[] ATTRS = new int[]{android.R.attr.listDivider};
public static int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
public static int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
private Drawable mDivider;
private int mOrientation;
public MyVerDividerItemDecoration(Context context, int mOrientation) {
final TypedArray a = context.obtainStyledAttributes(ATTRS);
mDivider = a.getDrawable(0);
this.mOrientation = mOrientation;
setOrientation(mOrientation);
}
private void setOrientation(int orientation) {
if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
throw new IllegalArgumentException("invalid orientation");
}
mOrientation = orientation;
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
if (mOrientation == VERTICAL_LIST) {
drawVertical(c, parent);
} else {
drawHorizontal(c, parent);
}
}
public void drawVertical(Canvas c, RecyclerView parent) {
final int left = parent.getPaddingLeft();
final int right = parent.getWidth() - parent.getPaddingRight();
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext());
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
final int top = child.getBottom() + params.bottomMargin;
final int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
public void drawHorizontal(Canvas c, RecyclerView parent) {
final int top = parent.getPaddingTop();
final int bottom = parent.getHeight() - parent.getPaddingBottom();
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
final int left = child.getRight() + params.rightMargin;
final int right = left + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
@Override
public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
if (mOrientation == VERTICAL_LIST) {
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
} else {
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
}
}
}
至于Adapter我就不给出来了,自己下载了看吧。项目链接