RecyclerView是非常灵活的,通过导入support-v7包对其进行使用,通过设置它提供的不同LayoutManager,ItemDecoration,ItemAnimator实现各种效果
<1>通过设置LayoutManager来控制其显示方式
<2>通过ItemDecoration绘制Item的间隔
<3>通过ItemAnimator控制item增删的动画
<4>控制Item的点击监听,需要自行定义
<5>实现分页加载
<6>多布局
recyclerView = ((RecyclerView) view.findViewById(R.id.evaluat_recyclerView));
//初始化RecyclerView管理者
RecyclerView.LayoutManager manager=new LinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL,false);
//给RecyclerView设置管理者
recyclerView.setLayoutManager(manager);
实现分页加载
//RecyclerView的滚动监听,监听是否滑到底部
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//停止滑动
if(newState==RecyclerView.SCROLL_STATE_IDLE){
//获取RecyclerView的管理者
RecyclerView.LayoutManager manager=recyclerView.getLayoutManager();
int lastPosition=-1;
//如果是线性布局管理者,获取管理者的最后一条可视Item的位置
if(manager instanceof LinearLayoutManager){
lastPosition=((LinearLayoutManager) manager).findLastVisibleItemPosition();
} else if(manager instanceof GridLayoutManager){
//如果是网格布局管理者,获取管理者的最后一条可视Item的位置
lastPosition=((GridLayoutManager) manager).findLastVisibleItemPosition();
}else if(manager instanceof StaggeredGridLayoutManager){
//如果是流式布局管理者,获取管理者的最后显示Item,由于流式布局的特殊性,所以得到的是一个数组
int[] lastPositions=new int[((StaggeredGridLayoutManager) manager).getSpanCount()];
//比较数组,选择最大的Item
((StaggeredGridLayoutManager) manager).findLastVisibleItemPositions(lastPositions);
lastPosition=findMax(lastPositions);
}
//如果得到的最后一条Item的位置与ItemCount-1相等,则表示滑动到最后了,进行网络请求,刷新适配器
if(lastPosition==recyclerView.getLayoutManager().getItemCount()-1){
//加载更多数据 initData(list.get(list.size()-1).getId());
}
}
}
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
});
private int findMax(int[] lastPositions){
//找出流式布局中,最大的位置
int max=lastPositions[0];
for (int i = 0; i < lastPositions.length; i++) {
if(max<lastPositions[i]){
max=lastPositions[i];
}
}
return max;
}
将数据显示在RecyclerView上,点击item进行跳转
private void getAdapter(final List<PictrueBean> list){
//如果adapter为空,则实例化,并给RecyclerView设置adapter,否则刷新adapter
if(adapter==null){
adapter=new PictrueAdapter(list, getActivity(), new PictrueAdapter.OnItemClickListener() {
@Override
public void onItemClickListener(View view, int position) {
Intent intent=new Intent(getActivity(), NewsDetailActivity.class);
intent.putExtra("id",list.get(position).getId());
intent.putExtra("title",list.get(position).getTitle());
startActivity(intent);
}
});
recyclerView.setAdapter(adapter);
}else{
adapter.notifyDataSetChanged();
}
}
实现多布局的adapter
public class PictrueAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<PictrueBean> list;
private Context context;
private LayoutInflater inflater;
private OnItemClickListener onItemClickListener;
public PictrueAdapter(List<PictrueBean> list, Context context, OnItemClickListener onItemClickListener) {
this.list = list;
this.context = context;
inflater = LayoutInflater.from(context);
this.onItemClickListener = onItemClickListener;
}
//设置监听
public interface OnItemClickListener {
void onItemClickListener(View view, int position);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = null;
RecyclerView.ViewHolder viewHolder = null;
//判断是哪种样式,加载哪种布局
switch (viewType) {
case 0:
view = inflater.inflate(R.layout.pictrue_adapter_layout, parent, false);
viewHolder = new MyViewHolder(view);
break;
case 1:
view = inflater.inflate(R.layout.pictrue_item_layout, parent, false);
viewHolder = new MyViewHolder2(view);
break;
}
return viewHolder;
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, int position) {
//判断不同的样式,显示不同的内容
if(holder instanceof MyViewHolder) {
((MyViewHolder) holder).tvTitle.setText(list.get(position).getTitle());
((MyViewHolder) holder).tvCount.setText(list.get(position).getImgcount());
((MyViewHolder) holder).tvComment.setText(list.get(position).getReviewcount() + "");
Picasso.with(context).load(list.get(position).getBigimgsrc()).error(R.drawable.default_news).into(((MyViewHolder) holder).iv);
}else if(holder instanceof MyViewHolder2) {
((MyViewHolder2)holder).tvTitle.setText(list.get(position).getTitle());
((MyViewHolder2)holder).tvCount.setText(list.get(position).getImgcount());
((MyViewHolder2)holder).tvComment.setText(list.get(position).getReviewcount()+"");
String img=list.get(position).getSmallimgsrc();
String[] imgs=img.split("\\|");
Picasso.with(context).load(imgs[0]).error(R.drawable.default_news).into(((MyViewHolder2) holder).iv1);
Picasso.with(context).load(imgs[1]).error(R.drawable.default_news).into(((MyViewHolder2) holder).iv2);
Picasso.with(context).load(imgs[2]).error(R.drawable.default_news).into(((MyViewHolder2) holder).iv3);
}
//设置点击item监听
if (onItemClickListener != null) {
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int pos = holder.getLayoutPosition();
onItemClickListener.onItemClickListener(holder.itemView, pos);
}
});
}
}
//设置不用的样式
@Override
public int getItemViewType(int position) {
if (position % 2 == 0) {
return 0;
} else {
return 1;
}
}
@Override
public int getItemCount() {
return list == null ? 0 : list.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
ImageView iv;
TextView tvTitle, tvComment, tvCount;
public MyViewHolder(View itemView) {
super(itemView);
iv = ((ImageView) itemView.findViewById(R.id.pictrue_iv));
tvComment = ((TextView) itemView.findViewById(R.id.pictrue_comment));
tvTitle = ((TextView) itemView.findViewById(R.id.pictrue_title));
tvCount = ((TextView) itemView.findViewById(R.id.pictrue_count));
}
}
class MyViewHolder2 extends RecyclerView.ViewHolder {
ImageView iv1,iv2,iv3;
TextView tvTitle, tvComment, tvCount;
public MyViewHolder2(View itemView) {
super(itemView);
iv1 = ((ImageView) itemView.findViewById(R.id.pictrue_item_iv1));
iv2= ((ImageView) itemView.findViewById(R.id.pictrue_item_iv2));
iv3 = ((ImageView) itemView.findViewById(R.id.pictrue_item_iv3));
tvComment = ((TextView) itemView.findViewById(R.id.pictrue_item_comment));
tvTitle = ((TextView) itemView.findViewById(R.id.pictrue_item_title));
tvCount = ((TextView) itemView.findViewById(R.id.pictrue_item_count));
}
}
}
多布局的xml文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="13dp"
android:layout_marginRight="13dp"
android:layout_marginTop="5dp">
<TextView
android:id="@+id/pictrue_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textColor="#000"/>
<ImageView
android:id="@+id/pictrue_iv"
android:layout_width="match_parent"
android:layout_height="120dp"
android:layout_below="@+id/pictrue_title"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:scaleType="fitXY"/>
<TextView
android:id="@+id/pictrue_comment"
android:layout_below="@+id/pictrue_iv"
android:drawableRight="@mipmap/comment_icon"
android:layout_width="wrap_content"
android:layout_alignParentRight="true"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp" />
<TextView
android:layout_toLeftOf="@+id/pictrue_comment"
android:id="@+id/pictrue_count"
android:layout_below="@+id/pictrue_iv"
android:drawableRight="@mipmap/img_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/color"
android:layout_marginTop="5dp"
android:layout_below="@id/pictrue_comment"
/>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="13dp"
android:layout_marginRight="13dp"
android:layout_marginTop="5dp">
<TextView
android:id="@+id/pictrue_item_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="#000"
android:textSize="18sp" />
<LinearLayout
android:layout_below="@+id/pictrue_item_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginTop="5dp"
android:id="@+id/pictrue_ll">
<ImageView
android:id="@+id/pictrue_item_iv1"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="120dp"
android:layout_marginRight="5dp"
android:scaleType="fitXY" />
<ImageView
android:id="@+id/pictrue_item_iv2"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="120dp"
android:layout_marginRight="5dp"
android:scaleType="fitXY" />
<ImageView
android:id="@+id/pictrue_item_iv3"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="120dp"
android:scaleType="fitXY" />
</LinearLayout>
<TextView
android:id="@+id/pictrue_item_comment"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@+id/pictrue_ll"
android:layout_marginTop="5dp"
android:drawableRight="@mipmap/comment_icon"
/>
<TextView
android:id="@+id/pictrue_item_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/pictrue_ll"
android:layout_marginTop="5dp"
android:layout_toLeftOf="@+id/pictrue_item_comment"
android:drawableRight="@mipmap/img_num"
android:layout_marginRight="10dp"/>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_below="@id/pictrue_item_comment"
android:layout_marginTop="5dp"
android:background="@color/color" />
</RelativeLayout>