首先需要v7包
如果显示的是图片,可以用下面这个AutoLoadRecyclerView,他可以在快速滑动时停止加载,避免OOM和内存资源浪费
public class AutoLoadRecyclerView extends RecyclerView {
public AutoLoadRecyclerView(Context context) {
this(context, null);
}
public AutoLoadRecyclerView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public AutoLoadRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setOnScrollListener(new AutoLoadScrollListener(null, true, true));
}
/**
* 配置显示图片,需要设置这几个参数,快速滑动时,暂停图片加载
*
* @param imageLoader ImageLoader实例对象
* @param pauseOnScroll
* @param pauseOnFling
*/
public void setOnPauseListenerParams(ImageLoader imageLoader, boolean pauseOnScroll, boolean pauseOnFling) {
setOnScrollListener(new AutoLoadScrollListener(imageLoader, pauseOnScroll, pauseOnFling));
}
//加载更多的回调接口
public interface onLoadMoreListener {
void loadMore();
}
/**
* 滑动自动加载监听器
*/
private class AutoLoadScrollListener implements OnScrollListener {
private ImageLoader imageLoader;
private final boolean pauseOnScroll;
private final boolean pauseOnFling;
public AutoLoadScrollListener(ImageLoader imageLoader, boolean pauseOnScroll, boolean pauseOnFling) {
super();
this.pauseOnScroll = pauseOnScroll;
this.pauseOnFling = pauseOnFling;
this.imageLoader = imageLoader;
}
@Override
public void onScrollStateChanged(int i) {
//根据newState状态做处理
if (imageLoader != null) {
switch (i) {
case 0:
imageLoader.resume();
break;
case 1:
if (pauseOnScroll) {
imageLoader.pause();
} else {
imageLoader.resume();
}
break;
case 2:
if (pauseOnFling) {
imageLoader.pause();
} else {
imageLoader.resume();
}
break;
}
}
}
@Override
public void onScrolled(int i, int i1) {
}
}
}
接下来在布局文件中使用它
<com.robosea.robofish.view.AutoLoadRecyclerView
android:id="@+id/mRecyclerView"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="94px"
android:background="@drawable/local_bottom_list_bg"
android:paddingBottom="13px"
android:paddingLeft="30px"
android:paddingRight="30px"
android:paddingTop="13px"
android:scrollbars="none"/>
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView$LayoutManager.onMeasure(android.support.v7.widget.RecyclerView$Recycler, android.support.v7.widget.RecyclerView$State, int, int)' on a null object reference
设置布局管理器,findViewById之后就设置
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
mRecyclerView.setLayoutManager(layoutManager);
那么RecyclerView条目的间距怎么设置呢?使用RecyclerView的addItemDecoration方法,
方法参数依靠这个类来设置:
public class SpacesItemDecoration extends RecyclerView.ItemDecoration {
private int space;
public SpacesItemDecoration(int space) {
this.space = space;
}
@Override
public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
super.getItemOffsets(outRect, itemPosition, parent);
outRect.left = space;
outRect.right = space;
outRect.bottom = space;
// Add top margin only for the first item to avoid double space between items
// if(itemPosition == 0)
// outRect.top = space;
}
}
使用的时候定义一个int值,也就是间隔的像素,传入SpacesItemDecoration的构造参数就可以了
int spacingInPixels = 9;
mRecyclerView.addItemDecoration(new SpacesItemDecoration(spacingInPixels));
最后就是设置Adapter了,以下面这个Adapter为例,我们可以看到展示数据和设置条目的点击事件
public class LocalVideoGalleryAdapter extends RecyclerView.Adapter<LocalVideoGalleryAdapter.ViewHolder> {
private Activity activity;
private LayoutInflater mInflater;
private List<Video> imageInfoList;
private OnItemClickLitener mOnItemClickLitener;
public LocalVideoGalleryAdapter(List<Video> imageInfoList, Activity activity) {
this.imageInfoList = imageInfoList;
this.activity = activity;
mInflater = LayoutInflater.from(activity);
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View arg0) {
super(arg0);
}
ImageView mImg;
}
@Override
public int getItemCount() {
return imageInfoList.size();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = mInflater.inflate(R.layout.activity_index_gallery_item, viewGroup, false);
ViewHolder viewHolder = new ViewHolder(view);
viewHolder.mImg = (ImageView) view.findViewById(R.id.id_index_gallery_item_image);
return viewHolder;
}
@Override
public void onBindViewHolder(final ViewHolder viewHolder, final int i) {
App.imageLoader.displayImage("file://" + imageInfoList.get(i).getPath(), viewHolder.mImg, App.options);
if (mOnItemClickLitener != null) {
viewHolder.itemView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mOnItemClickLitener.onItemClick(viewHolder.itemView, i);
}
});
}
}
public interface OnItemClickLitener {
void onItemClick(View view, int position);
}
public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener) {
this.mOnItemClickLitener = mOnItemClickLitener;
}
}
我们需要写一个ViewHolder类来继承RecyclerView.ViewHolder
在onCreateViewHolder方法中找到条目中的View
在onBindViewHolder对条目设置数据,由于RecyclerView和其他View不同,并没有setOnItemClickLitener这个方法,所以我们需要自己来创造一个setOnItemClickLitener方法。
做法就是对条目中的View设置点击事件在点击事件中调取我们自己定义的接口OnItemClickLitener中的回调方法onItemClick
Activity中使用的时候,让Activity实现我们自定义的OnItemClickLitener接口,对RecyclerView使用我们自己写的setOnItemClickLitener方法,传入this就可以了
mAdapter.setOnItemClickLitener(this);
在getItemCount方法中传入条目的数量
其他相关:
mRecyclerView.scrollToPosition(position); //滚动到对应索引位置(当该位置已经展示在屏幕中时,并不会出现滚动效果)