不说废话:直接代码
package com.example.recyclerveiwdemo;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import com.example.recyclerveiwdemo.adapter.MyAdapter;
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private MyAdapter myAdapter;
private LinearLayoutManager linearLayoutManager;
private GridLayoutManager gridLayoutManager;
private StaggeredGridLayoutManager staggeredGridLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
//listView的形式展示
linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
//gridview的形式展示,可以通过setSpanSizeLookup 来自定义每个item占的列数
gridLayoutManager = new GridLayoutManager(this, 3);
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return 3 - position % 3;
}
});
//瀑布流的形式
staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager);
myAdapter = new MyAdapter();
recyclerView.setAdapter(myAdapter);
myAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {
@Override
public void onItemClick(View v, int position) {
//增加和删除的话 不直接对postion做处理,因为此处的position是没有刷新以前的position
myAdapter.add(position);
}
});
myAdapter.setOnItemLongClickListener(new MyAdapter.OnItemLongClickListener() {
@Override
public void onItemLongClick(View v, int position) {
//remove的操作
// myAdapter.remove(position);
//更新的操作
myAdapter.updata(position,"这是我更新的内容");
}
});
recyclerView.addItemDecoration(new MyDecoration(this,LinearLayoutManager.VERTICAL));
}
public void onClick(View v) {
//切换布局
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager == null) {
return;
}
//if和elseif是有先后顺序的,先判断范围小的,然后再判断范围大的,
//因为GridLayoutManager 是继承 LinearLayoutManager ,所以他本质上也是LinearLayoutManager,
//所以不能先判断是否是LinearLayoutManager (LinearLayoutManager范围大)
if (layoutManager instanceof GridLayoutManager) {
recyclerView.setLayoutManager(linearLayoutManager);
} else if (layoutManager instanceof LinearLayoutManager) {
recyclerView.setLayoutManager(gridLayoutManager);
}
}
}
package com.example.recyclerveiwdemo;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
/**
* Created by hasee on 2017/8/31.
*/
public class MyDecoration extends RecyclerView.ItemDecoration {
private Context mContext;
private Drawable mDivider;
private int mOrientation;
public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
//我们通过获取系统属性中的listDivider来添加,在系统中的AppTheme中设置
public static final int[] ATRRS = new int[]{
android.R.attr.listDivider
};
public MyDecoration(Context context, int orientation) {
this.mContext = context;
final TypedArray ta = context.obtainStyledAttributes(ATRRS);
this.mDivider = ta.getDrawable(0);
ta.recycle();
setOrientation(orientation);
}
//设置屏幕的方向
public 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 == HORIZONTAL_LIST) {
drawVerticalLine(c, parent, state);
} else {
drawHorizontalLine(c, parent, state);
}
}
//画横线, 这里的parent其实是显示在屏幕显示的这部分
public void drawHorizontalLine(Canvas c, RecyclerView parent, RecyclerView.State state) {
int left = parent.getPaddingLeft();
int right = parent.getWidth() - parent.getPaddingRight();
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
//获得child的布局信息
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final int top = child.getBottom() + params.bottomMargin;
final int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left+params.leftMargin, top, right-params.leftMargin, bottom);
mDivider.draw(c);
//Log.d("wnw", left + " " + top + " "+right+" "+bottom+" "+i);
}
}
//画竖线
public void drawVerticalLine(Canvas c, RecyclerView parent, RecyclerView.State state) {
int top = parent.getPaddingTop();
int bottom = parent.getHeight() - parent.getPaddingBottom();
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
//获得child的布局信息
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();
final int left = child.getRight() + params.rightMargin;
final int right = left + mDivider.getIntrinsicWidth();
mDivider.setBounds(left, top+params.topMargin, right, bottom-params.topMargin);
mDivider.draw(c);
}
}
//由于Divider也有长宽高,每一个Item需要向下或者向右偏移
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
if (mOrientation == HORIZONTAL_LIST) {
//画横线,就是往下偏移一个分割线的高度
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
} else {
//画竖线,就是往右偏移一个分割线的宽度
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
}
}
}
package com.example.recyclerveiwdemo.adapter;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.example.recyclerveiwdemo.R;
import java.util.ArrayList;
/**
* Created by hasee on 2017/8/30.
*/
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
ArrayList<String> list;
public MyAdapter() {
list = new ArrayList<>();
for (int i = 0; i < 30; i++) {
list.add("条目 " + i);
}
}
//创建布局和viewHolder
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//inflate的时候,需要传入parent和attachToRoot==false; 使用传入三个参数的方法
View recyclerViewItem = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view_item, parent, false);
return new MyViewHolder(recyclerViewItem);
}
//增加的方法
public void add(int position) {
//改变数据
list.add(position + 1, "这是新加的");
//调用它带的方法去刷新
notifyItemRangeChanged(position + 1, getItemCount());
}
public void remove(int position) {
list.remove(position);
notifyItemRangeRemoved(position, getItemCount());
}
public void updata(int position, String content) {
list.remove(position);
list.add(position, content);
notifyItemChanged(position);
}
//单击事件的接口
public interface OnItemClickListener {
void onItemClick(View v, int position);
}
//长按事件的接口
public interface OnItemLongClickListener {
void onItemLongClick(View v, int position);
}
private OnItemClickListener mItemClickListener;
private OnItemLongClickListener mItemLongClickListener;
//设置单击事件的接口
public void setOnItemClickListener(OnItemClickListener itemClickListener) {
mItemClickListener = itemClickListener;
}
//设置长按事件的接口
public void setOnItemLongClickListener(OnItemLongClickListener itemLongClickListener) {
mItemLongClickListener = itemLongClickListener;
}
//绑定数据
@Override
public void onBindViewHolder(MyViewHolder holder, final int position) {
holder.title.setText(list.get(position));
//整个item条目的点击
// holder.itemView.setOnClickListener(new View.OnClickListener() {
// @Override
// public void onClick(View v) {
// TODO: 2017/8/31 暴露一个单击回调接口
// if (mItemClickListener != null) {
// mItemClickListener.onItemClick(v, position);
// }
// }
// });
holder.icon.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TODO: 2017/8/31 暴露一个单击回调接口
if (mItemClickListener != null) {
mItemClickListener.onItemClick(v, position);
}
}
});
holder.icon.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (mItemLongClickListener != null) {
mItemLongClickListener.onItemLongClick(v, position);
}
// true 消费这个长按事件
return true;
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
//把整个view放到viewHolder中
View itemView;
TextView title;
ImageView icon;
//findviewById 给控件绑定id
public MyViewHolder(View itemView) {
super(itemView);
this.itemView = itemView;
title = (TextView) itemView.findViewById(R.id.title);
icon = (ImageView) itemView.findViewById(R.id.icon);
}
}
}