Materialdesign-recyclerview简单封装
2018-01-13 22:07
281 查看
添加依赖
adapter封装
添加条目间隔线.写一个条目装饰类,继承RecyclerView.ItemDecoration绘制分发,绘制RecyclerView的时候会分发Canvas到ItemDecoration里面。
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.v4.view.ViewCompat;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ItemDecoration;
import android.support.v7.widget.RecyclerView.LayoutParams;
import android.support.v7.widget.RecyclerView.State;
import android.view.View;
public class DividerItemDecoration extends ItemDecoration {
private int mOrientation = LinearLayoutManager.VERTICAL;
private Drawable mDivider;
private int[] attrs= new int[]{
android.R.attr.listDivider
};
public DividerItemDecoration(Context context, int orientation) {
TypedArray typedArray = context.obtainStyledAttributes(attrs);
mDivider = typedArray.getDrawable(0);
typedArray.recycle();
setOrientation(orientation);
}
public void setOrientation(int orientation){
if(orientation!=LinearLayoutManager.HORIZONTAL&&orientation!=LinearLayoutManager.VERTICAL){
throw new IllegalArgumentException("非水平和线性的枚举类型!");
}
this.mOrientation = orientation;
}
@Override
public void onDraw(Canvas c, RecyclerView parent, State state) {
//2。调用这个绘制方法, RecyclerView会毁掉该绘制方法,绘制条目的间隔线
if(mOrientation == LinearLayoutManager.VERTICAL){//垂直
drawVertical(c,parent);
}else{//水平
drawHorizontal(c,parent);
}
super.onDraw(c, parent, state);
}
private void drawHorizontal(Canvas c, RecyclerView parent) {
int top = parent.getPaddingTop();
int bottom = parent.getHeight() - parent.getPaddingBottom();
int childCount = parent.getChildCount();
for (int i = 0; i < childCount ; i++) {
View child = parent.getChildAt(i);
RecyclerView.LayoutParams params = (LayoutParams) child.getLayoutParams();
int left = child.getRight() + params.rightMargin + Math.round(ViewCompat.getTranslationX(child));
int right = left + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top , right, bottom);
mDivider.draw(c);
}
}
private void drawVertical(Canvas c, RecyclerView parent) {
// 画水平线
int left = parent.getPaddingLeft();
int right = parent.getWidth() - parent.getPaddingRight();
int childCount = parent.getChildCount();
for (int i = 0; i < childCount ; i++) {
View child = parent.getChildAt(i);
RecyclerView.LayoutParams params = (LayoutParams) child.getLayoutParams();
int top = child.getBottom() + params.bottomMargin + Math.round(ViewCompat.getTranslationY(child));
int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top , right, bottom);
mDivider.draw(c);
}
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
State state) {
//1.调用此方法(首先会先获取条目之间的间隙宽度---Rect矩形区域)
// 获得条目的偏移量(所有的条目都回调用一次该方法)
if(mOrientation == LinearLayoutManager.VERTICAL){//垂直
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
}else{//水平
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0 );
}
}
}
DividerGridViewItemDecoration
import java.util.ArrayList;
import com.ricky.materialdesign.recyclerview.MyRecyclerAdapter.OnItemClickListener;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ItemDecoration;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
private RecyclerView recylerview;
private ArrayList<String> list;
private MyRecyclerAdapter adapter;
// private MyStaggedRecyclerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = new ArrayList<String>();
for (int i = 0; i < 60; i++) {
list.add("item"+i);
}
recylerview = (RecyclerView)findViewById(R.id.recylerview);
adapter = new MyRecyclerAdapter(list);
// adapter = new MyStaggedRecyclerAdapter(list);
//LayoutManager布局摆放管理器(线性摆放、瀑布流)
// recylerview.setLayoutManager(new LinearLayoutManager(this));//默认垂直
//reverseLayout:数据倒置,从右边开始滑动
// recylerview.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true));
recylerview.setLayoutManager(new GridLayoutManager(this, 3));
//瀑布流效果
// recylerview.setLayoutManager(new StaggeredGridLayoutManager(3, LinearLayoutManager.VERTICAL));
recylerview.setAdapter(adapter);
//添加间隔线
decor = new DividerGridViewItemDecoration(this);
recylerview.addItemDecoration(decor);
//添加条目动画
recylerview.setItemAnimator(new DefaultItemAnimator());
adapter.setOnItemClickListener(new OnItemClickListener() {
//条目点击事件
@Override
public void onItemClick(View view, int position) {
Toast.makeText(MainActivity.this, "点我干嘛"+position, 0).show();
}
});
}
boolean isGrid = false;
private ItemDecoration decor;
//布局切换
public void change(View v){
if(decor!=null)
recylerview.removeItemDecoration(decor);
if(!isGrid){
// recylerview.setLayoutManager(new GridLayoutManager(this, 3));
recylerview.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false));//默认垂直
decor = new DividerItemDecoration(this, LinearLayoutManager.HORIZONTAL);
recylerview.addItemDecoration(decor);
}else{
recylerview.setLayoutManager(new LinearLayoutManager(this));//默认垂直
decor = new DividerItemDecoration(this, LinearLayoutManager.VERTICAL);
recylerview.addItemDecoration(decor);
}
isGrid = !isGrid;
}
//添加条目
public void addItem(View v){
adapter.addData(3);
}
}
compile ‘com.android.support:recyclerview-v7:23.2.1’
adapter封装
import java.util.List; import android.support.v7.widget.RecyclerView; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.TextView; public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.MyViewHolder> { private List<String> list; private OnItemClickListener mOnItemClickListener; public MyRecyclerAdapter(List<String> list) { // TODO Auto-generated constructor stub this.list = list; } class MyViewHolder extends RecyclerView.ViewHolder{ TextView tv; public MyViewHolder(View view) { super(view); tv = (TextView)view.findViewById(android.R.id.text1); } } @Override public int getItemCount() { // TODO Auto-generated method stub return list.size(); } @Override public void onBindViewHolder(MyViewHolder holder, final int position) { //绑定数据 holder.tv.setText(list.get(position)); if(mOnItemClickListener!=null){ holder.itemView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mOnItemClickListener.onItemClick(v, position); } }); } } @Override public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int arg1) { // 创建ViewHolder MyViewHolder holder = new MyViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate( android.R.layout.simple_list_item_1, viewGroup,false)); return holder; } public void addData(int position){ list.add(position,"additem"+position); //刷新变动的条目比直接使用notifyDataSetChanged()刷新列表效率更高 notifyItemInserted(position); } public void removeData(int position){ list.remove(position); notifyItemRemoved(position); } //自定义接口实现条目点击 public interface OnItemClickListener{ void onItemClick(View view, int position); } public void setOnItemClickListener(OnItemClickListener listener){ this.mOnItemClickListener = listener; } }
添加条目间隔线.写一个条目装饰类,继承RecyclerView.ItemDecoration绘制分发,绘制RecyclerView的时候会分发Canvas到ItemDecoration里面。
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.v4.view.ViewCompat;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ItemDecoration;
import android.support.v7.widget.RecyclerView.LayoutParams;
import android.support.v7.widget.RecyclerView.State;
import android.view.View;
public class DividerItemDecoration extends ItemDecoration {
private int mOrientation = LinearLayoutManager.VERTICAL;
private Drawable mDivider;
private int[] attrs= new int[]{
android.R.attr.listDivider
};
public DividerItemDecoration(Context context, int orientation) {
TypedArray typedArray = context.obtainStyledAttributes(attrs);
mDivider = typedArray.getDrawable(0);
typedArray.recycle();
setOrientation(orientation);
}
public void setOrientation(int orientation){
if(orientation!=LinearLayoutManager.HORIZONTAL&&orientation!=LinearLayoutManager.VERTICAL){
throw new IllegalArgumentException("非水平和线性的枚举类型!");
}
this.mOrientation = orientation;
}
@Override
public void onDraw(Canvas c, RecyclerView parent, State state) {
//2。调用这个绘制方法, RecyclerView会毁掉该绘制方法,绘制条目的间隔线
if(mOrientation == LinearLayoutManager.VERTICAL){//垂直
drawVertical(c,parent);
}else{//水平
drawHorizontal(c,parent);
}
super.onDraw(c, parent, state);
}
private void drawHorizontal(Canvas c, RecyclerView parent) {
int top = parent.getPaddingTop();
int bottom = parent.getHeight() - parent.getPaddingBottom();
int childCount = parent.getChildCount();
for (int i = 0; i < childCount ; i++) {
View child = parent.getChildAt(i);
RecyclerView.LayoutParams params = (LayoutParams) child.getLayoutParams();
int left = child.getRight() + params.rightMargin + Math.round(ViewCompat.getTranslationX(child));
int right = left + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top , right, bottom);
mDivider.draw(c);
}
}
private void drawVertical(Canvas c, RecyclerView parent) {
// 画水平线
int left = parent.getPaddingLeft();
int right = parent.getWidth() - parent.getPaddingRight();
int childCount = parent.getChildCount();
for (int i = 0; i < childCount ; i++) {
View child = parent.getChildAt(i);
RecyclerView.LayoutParams params = (LayoutParams) child.getLayoutParams();
int top = child.getBottom() + params.bottomMargin + Math.round(ViewCompat.getTranslationY(child));
int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top , right, bottom);
mDivider.draw(c);
}
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent,
State state) {
//1.调用此方法(首先会先获取条目之间的间隙宽度---Rect矩形区域)
// 获得条目的偏移量(所有的条目都回调用一次该方法)
if(mOrientation == LinearLayoutManager.VERTICAL){//垂直
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
}else{//水平
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0 );
}
}
}
DividerGridViewItemDecoration
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.RecyclerView; import android.support.v7.widget.RecyclerView.ItemDecoration; import android.support.v7.widget.RecyclerView.LayoutParams; import android.support.v7.widget.RecyclerView.State; import android.view.View; public class DividerGridViewItemDecoration extends ItemDecoration { private Drawable mDivider; private int[] attrs= new int[]{ android.R.attr.listDivider }; public DividerGridViewItemDecoration(Context context) { TypedArray typedArray = context.obtainStyledAttributes(attrs); mDivider = typedArray.getDrawable(0); typedArray.recycle(); } @Override public void onDraw(Canvas c, RecyclerView parent, State state) { drawVertical(c,parent); drawHorizontal(c,parent); } private void drawHorizontal(Canvas c, RecyclerView parent) { // 绘制水平间隔线 int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams params = (LayoutParams) child.getLayoutParams(); int left = child.getLeft() - params.leftMargin; int right = child.getRight()+ params.rightMargin; int top = child.getBottom() + params.bottomMargin; int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } private void drawVertical(Canvas c, RecyclerView parent) { //绘制垂直间隔线(垂直的矩形) int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { View child = parent.getChildAt(i); RecyclerView.LayoutParams params = (LayoutParams) child.getLayoutParams(); int left = child.getRight() + params.rightMargin; int right = left + mDivider.getIntrinsicWidth(); int top = child.getTop() - params.topMargin; int bottom = child.getBottom() + params.bottomMargin; mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } @Override @Deprecated public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { // 四个方向的偏移值 int right = mDivider.getIntrinsicWidth(); int bottom = mDivider.getIntrinsicHeight(); outRect.set(0, 0, right, bottom); } }调用
import java.util.ArrayList;
import com.ricky.materialdesign.recyclerview.MyRecyclerAdapter.OnItemClickListener;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ItemDecoration;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends Activity {
private RecyclerView recylerview;
private ArrayList<String> list;
private MyRecyclerAdapter adapter;
// private MyStaggedRecyclerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list = new ArrayList<String>();
for (int i = 0; i < 60; i++) {
list.add("item"+i);
}
recylerview = (RecyclerView)findViewById(R.id.recylerview);
adapter = new MyRecyclerAdapter(list);
// adapter = new MyStaggedRecyclerAdapter(list);
//LayoutManager布局摆放管理器(线性摆放、瀑布流)
// recylerview.setLayoutManager(new LinearLayoutManager(this));//默认垂直
//reverseLayout:数据倒置,从右边开始滑动
// recylerview.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true));
recylerview.setLayoutManager(new GridLayoutManager(this, 3));
//瀑布流效果
// recylerview.setLayoutManager(new StaggeredGridLayoutManager(3, LinearLayoutManager.VERTICAL));
recylerview.setAdapter(adapter);
//添加间隔线
decor = new DividerGridViewItemDecoration(this);
recylerview.addItemDecoration(decor);
//添加条目动画
recylerview.setItemAnimator(new DefaultItemAnimator());
adapter.setOnItemClickListener(new OnItemClickListener() {
//条目点击事件
@Override
public void onItemClick(View view, int position) {
Toast.makeText(MainActivity.this, "点我干嘛"+position, 0).show();
}
});
}
boolean isGrid = false;
private ItemDecoration decor;
//布局切换
public void change(View v){
if(decor!=null)
recylerview.removeItemDecoration(decor);
if(!isGrid){
// recylerview.setLayoutManager(new GridLayoutManager(this, 3));
recylerview.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,false));//默认垂直
decor = new DividerItemDecoration(this, LinearLayoutManager.HORIZONTAL);
recylerview.addItemDecoration(decor);
}else{
recylerview.setLayoutManager(new LinearLayoutManager(this));//默认垂直
decor = new DividerItemDecoration(this, LinearLayoutManager.VERTICAL);
recylerview.addItemDecoration(decor);
}
isGrid = !isGrid;
}
//添加条目
public void addItem(View v){
adapter.addData(3);
}
}
相关文章推荐
- RecyclerView 的简单封装
- RecyclerViewAdapter的简单封装
- 对recyclerview的简单封装
- 擦!RecyclerView的适配器确实比listview的简单些,因为tag都做了封装了
- RecyclerView的适配器简单封装,再也不用重复写适配器了
- 对RecyclerView的封装,使用简单,功能丰富
- Recyclerview的一些个人理解与使用(一)adapter的简单封装
- 简单封装RecyclerView的Adapter
- RecyclerView 上拉加载的简单封装
- RecyclerView Adapter简单封装
- RecyclerView 使用的简单封装
- Android中RecyclerView的适配器的简单封装
- RecyclerView适配器的简单封装-BaseAdapter
- RecyclerView.Adapter 的简单封装
- RecyclerView之ViewHolder封装实现点击、长按、headerView和多选功能
- [置顶] Android RecyclerView简单请求数据框架
- 封装RecyclerView.Adapter
- RecyclerView通用适配器Adapter,对Adapter的封装
- 355_封装RecyclerView的Adapter
- android RecyclerView的简单用法