您的位置:首页 > 其它

Materialdesign-recyclerview简单封装

2018-01-13 22:07 281 查看
添加依赖

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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: