MainActivity
package com.example.recyclerview_click20170927;
import android.graphics.drawable.Drawable;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
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.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
RecyclerView rv;
List<String> list;
MyAdapter myadapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rv= (RecyclerView) findViewById(R.id.rv);
initData();
LinearLayoutManager mgr=new LinearLayoutManager(this);
rv.setLayoutManager(mgr);
//瀑布流
// StaggeredGridLayoutManager mgr=new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL);
// rv.setLayoutManager(mgr);
//GrideView
// GridLayoutManager mgr=new GridLayoutManager(this,3);
// rv.setLayoutManager(mgr);
myadapter=new MyAdapter();
rv.setAdapter(myadapter);
//设置分割线
rv.addItemDecoration(new MyDecoration(this));
//条目点击吐司
myadapter.setOnItemClickListener(new OnitemClickListener() {
@Override
public void onItemClick(int position) {
Toast.makeText(MainActivity.this,"///"+position,Toast.LENGTH_SHORT).show();
}
});
}
private void initData() {
list=new ArrayList<>();
for(int i=0;i<25;i++){
list.add("text"+i);
}
}
class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
//调用接口
OnitemClickListener listener;
//
public void setOnItemClickListener(OnitemClickListener listener){
this.listener=listener;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view= LayoutInflater.from(MainActivity.this).inflate(R.layout.item,parent,false);
// View view=View.inflate(parent.getContext(),R.layout.item,null);
MyViewHolder holder=new MyViewHolder(view);
//view点击事件
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(listener!=null){
listener.onItemClick((Integer) view.getTag());
}
}
});
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.tv.setText(list.get(position));
//条目的点击设置tag
holder.itemView.setTag(position);
//调节瀑布流的效果
// LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(
// LinearLayout.LayoutParams.MATCH_PARENT,
// 100+(int)(Math.random()*50));
// holder.iv.setLayoutParams(lp);
}
@Override
public int getItemCount() {
return list==null ? 0:list.size();
}
//MyViewHolder
class MyViewHolder extends RecyclerView.ViewHolder{
TextView tv;
ImageView iv;
public MyViewHolder(View itemView) {
super(itemView);
tv= (TextView) itemView.findViewById(R.id.tv);
iv= (ImageView) itemView.findViewById(R.id.iv);
}
}
}
//点击条目的接口
public interface OnitemClickListener{
//传个参数position
public void onItemClick(int position);
}
}
主布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.recyclerview_click20170927.MainActivity">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rv"
android:divider="#ffff0000"
android:dividerHeight="10dp"
>
</android.support.v7.widget.RecyclerView>
</RelativeLayout>
分割线的class--------继承(RecyclerView.ItemDecoration )
package com.example.recyclerview_click20170927;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.annotation.ColorInt;
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;
/**
* 作者: ${Liuentong} on2017/9/27 13:55
*/
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;
// 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);
// }
// }
// 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);
// final RecyclerView.LayoutParams params=(RecyclerView.LayoutParams)child.getLayoutParams();
// final int top =child.getBottom()+params.bottomMargin;
// final int bottom=top+mDivider.getIntrinsicHeight();
// mDivider.setBounds(left,top,right,bottom);
// mDivider.draw(c);
// }
// }
// 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);
// 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,right,bottom);
// mDivider.draw(c);
// }
// }
//
// @Override
// public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
// if(mOrientation==HORIZONTAL_LIST){
// outRect.set(0,0,mDivider.getIntrinsicWidth(),0);
//
// }else{
// outRect.set(0,0,0,mDivider.getIntrinsicHeight());
// }
// }
private static final int[] ATTRS = new int[] { android.R.attr.listDivider };
private Drawable mDivider;
public MyDecoration(Context context)
{
final TypedArray a = context.obtainStyledAttributes(ATTRS);
mDivider = a.getDrawable(0);
a.recycle();
}
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state)
{
drawHorizontal(c, parent);
drawVertical(c, parent);
}
private int getSpanCount(RecyclerView parent)
{
// 列数
int spanCount = -1;
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if (layoutManager instanceof GridLayoutManager)
{
spanCount = ((GridLayoutManager) layoutManager).getSpanCount();
} else if (layoutManager instanceof StaggeredGridLayoutManager)
{
spanCount = ((StaggeredGridLayoutManager) layoutManager)
.getSpanCount();
}
return spanCount;
}
public void drawHorizontal(Canvas c, RecyclerView parent)
{
int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++)
{
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
final int left = child.getLeft() - params.leftMargin;
final int right = child.getRight() + params.rightMargin
+ mDivider.getIntrinsicWidth();
final int top = child.getBottom() + params.bottomMargin;
final int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
public void drawVertical(Canvas c, RecyclerView parent)
{
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++)
{
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
final int top = child.getTop() - params.topMargin;
final int bottom = child.getBottom() + params.bottomMargin;
final int left = child.getRight() + params.rightMargin;
final int right = left + mDivider.getIntrinsicWidth();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
private boolean isLastColum(RecyclerView parent, int pos, int spanCount,
int childCount)
{
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if (layoutManager instanceof GridLayoutManager)
{
if ((pos + 1) % spanCount == 0)// 如果是最后一列,则不需要绘制右边
{
return true;
}
} else if (layoutManager instanceof StaggeredGridLayoutManager)
{
int orientation = ((StaggeredGridLayoutManager) layoutManager)
.getOrientation();
if (orientation == StaggeredGridLayoutManager.VERTICAL)
{
if ((pos + 1) % spanCount == 0)// 如果是最后一列,则不需要绘制右边
{
return true;
}
} else
{
childCount = childCount - childCount % spanCount;
if (pos >= childCount)// 如果是最后一列,则不需要绘制右边
return true;
}
}
return false;
}
private boolean isLastRaw(RecyclerView parent, int pos, int spanCount,
int childCount)
{
RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
if (layoutManager instanceof GridLayoutManager)
{
childCount = childCount - childCount % spanCount;
if (pos >= childCount)// 如果是最后一行,则不需要绘制底部
return true;
} else if (layoutManager instanceof StaggeredGridLayoutManager)
{
int orientation = ((StaggeredGridLayoutManager) layoutManager)
.getOrientation();
// StaggeredGridLayoutManager 且纵向滚动
if (orientation == StaggeredGridLayoutManager.VERTICAL)
{
childCount = childCount - childCount % spanCount;
// 如果是最后一行,则不需要绘制底部
if (pos >= childCount)
return true;
} else
// StaggeredGridLayoutManager 且横向滚动
{
// 如果是最后一行,则不需要绘制底部
if ((pos + 1) % spanCount == 0)
{
return true;
}
}
}
return false;
}
@Override
public void getItemOffsets(Rect outRect, int itemPosition,
RecyclerView parent)
{
int spanCount = getSpanCount(parent);
int childCount = parent.getAdapter().getItemCount();
if (isLastRaw(parent, itemPosition, spanCount, childCount))// 如果是最后一行,则不需要绘制底部
{
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
} else if (isLastColum(parent, itemPosition, spanCount, childCount))// 如果是最后一列,则不需要绘制右边
{
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
} else
{
outRect.set(0, 0, mDivider.getIntrinsicWidth(),
mDivider.getIntrinsicHeight());
}
}
}
设置分割线颜色
在项目的res下的drawable里新建一个divider.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:centerColor="#ff00ff00"
android:endColor="#ff0000ff"
android:startColor="#ffff0000"
android:type="linear" />
<size android:height="4dp"/>
</shape>
网友评论