说起Recycleview真的是太强大了,动画,瀑布流效果
废话不多说先看下简单的效果A-Z显示在TextView中
而且由此也可以看出需要两个布局一个装载RecycleView一个是A-z显示的位置需要TextView
如何实现A-z字母显示的recycleview首先需要一个集合里面放简单的String类型
private List<String> mData;
首先大家都知道要想实现这个肯定用循环 从A开始然后小于等于z然后之后将集合里面的数据添加进来代码如下
private void initData() {
mData=new ArrayList<String>();
//遍历A-z
for(int i='A';i<='z';i++){
//因为这里是char类型需要强制类型转换
mData.add(""+(char)i);
}
}
然后需要一个适配器去替代listview这里不要导错包
public class SimpleAdapter extends RecyclerView.Adapter<SimpleAdapter.MyViewHolder>
然后MyViewHolder集成RecycleView中的ViewHolder
class MyViewHolder extends RecyclerView.ViewHolder{
TextView id_tv;
public MyViewHolder(View itemView) {
super(itemView);
id_tv= (TextView) itemView.findViewById(R.id.tv_textview);
//初始化textview
// id_tv= (TextView) itemView.findViewById(R.id.id_tv);
}
}
然后重写以下几个方法
@Override
public SimpleAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
//子view实现与适配器的绑定以及监听都在这里 类似于listview中getView方法
public void onBindViewHolder(final MyViewHolder holder, int position)
//返回size大小
@Override
public int getItemCount()
下面看下具体代码
@Override
public SimpleAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//加载一个子布局
View view=mLayoutInflater.inflate(R.layout.item_textview, parent,false);
//创建MyHolder实例并返回holder
MyViewHolder holder=new MyViewHolder(view); //这里是view不是ViewGroup大家注意否则会报空指针异常
return holder;
}
textview绑定适配器获取每一个position位置
public void onBindViewHolder(final MyViewHolder holder, int position) {
holder.id_tv.setText(mData.get(position));
}
返回size大小
@Override
public int getItemCount() {
return mData.size();
}
最后看下构造方法
public SimpleAdapter(Context context, List<String> mData){
this.mContext=context;
this.mData=mData;
mLayoutInflater=LayoutInflater.from(context);
}
以及声明变量
//上下文对象
private Context mContext
//集合数据
private List<String> mData=new ArrayList<String>();
//布局加载器
private LayoutInflater mLayoutInflater;
最后在Activity中调用
initView();
initData();
adapter=new SimpleAdapter(RecycleViewActivity.this,mData);
//将recycleview与apdater绑定
recyclerView.setAdapter(adapter);
//线性布局管理器 recycler主要分为三种布局管理器 LinearLayoutManager GridLayoutManager StaggeredGridLayoutManager流式布局管理器当然也可以改成垂直方向,LinearLayoutManager.VERTICAL
LinearLayoutManager llm=new LinearLayoutManager(RecycleViewActivity.this,LinearLayoutManager.HORIZONTAL,false);
recyclerView.setLayoutManager(llm);
private void initView() {
recyclerView= (RecyclerView) findViewById(R.id.id_recyclview);
}
private void initData() {
mData=new ArrayList<String>();
for(int i='A';i<='z';i++){
mData.add(""+(char)i);
}
}
下面看瀑布流效果以及单击添加item长按删除item
回调接口
private onItemClickListener listener;
public interface onItemClickListener{
void onItemClick(View v,int position);
void onItemLongClick(View v,int position);
}
public void setOnItemClickListener(onItemClickListener listener){
this.listener=listener;
}
添加一个item方法
public void addData(int position){
mData.add(position,"add One Item");
notifyItemInserted(position);
}
移除一个item方法
public void removeData(int position){
mData.remove(position);
notifyItemRemoved(position);
//notifyItemMoved(position,position+1);
}
回调在onBIndViewHolder实现单击或者长按事件
public void onBindViewHolder(final MyViewHolder holder, int position) {
holder.id_tv.setText(mData.get(position));
//如果设置了回调则设置点击事件
if(listener!=null){
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int position=holder.getLayoutPosition();
listener.onItemClick(holder.itemView,position);
// Toast.makeText(mContext,"你单击了item",Toast.LENGTH_LONG).show();
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
int position=holder.getLayoutPosition();
listener.onItemLongClick(holder.itemView,position);
//Toast.makeText(mContext,"你长按了item",Toast.LENGTH_LONG).show();
return false;
}
});
}
}
主Activity调用
adapter.setOnItemClickListener(new SimpleAdapter.onItemClickListener() {
@Override
public void onItemClick(View v, int position) {
Toast.makeText(RecycleViewActivity.this, " click add item"+position,
Toast.LENGTH_SHORT).show();
adapter.addData(position);
}
@Override
public void onItemLongClick(View v, int position) {
Toast.makeText(RecycleViewActivity.this, " long click delete"+position,
Toast.LENGTH_SHORT).show();
adapter.removeData(position);
}
});
最后贴上全部代码RecycleActivity
package zm.jc.com.bmobsys;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import zm.jc.com.bmobsys.adapter.SimpleAdapter;
import zm.jc.com.bmobsys.view.DividerGridItemDecoration;
import zm.jc.com.bmobsys.view.MySharePop;
/**
* Created by John on 2017/1/16.
*/
public class RecycleViewActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private List<String> mData;
private SimpleAdapter adapter;
private MySharePop sharePop;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycleview);
initView();
initData();
adapter=new SimpleAdapter(RecycleViewActivity.this,mData);
recyclerView.setAdapter(adapter);
//StaggeredGridLayoutManager sgm=new StaggeredGridLayoutManager(1,3);
// LinearLayoutManager llm=new LinearLayoutManager(RecycleViewActivity.this,LinearLayoutManager.HORIZONTAL,false);
//recyclerView.setLayoutManager(llm);
recyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));
recyclerView.addItemDecoration(new DividerGridItemDecoration(RecycleViewActivity.this));
recyclerView.setItemAnimator(new DefaultItemAnimator());
adapter.setOnItemClickListener(new SimpleAdapter.onItemClickListener() {
@Override
public void onItemClick(View v, int position) {
Toast.makeText(RecycleViewActivity.this, " click add item"+position,
Toast.LENGTH_SHORT).show();
adapter.addData(position);
}
@Override
public void onItemLongClick(View v, int position) {
Toast.makeText(RecycleViewActivity.this, " long click delete"+position,
Toast.LENGTH_SHORT).show();
adapter.removeData(position);
}
});
//
// .srecyclerView.addItemDecoration(new DividerItemDecoration(RecycleViewActivity.this,DividerItemDecoration.VERTICAL_LIST));
// StaggeredGridLayoutManager sgm=new StaggeredGridLayoutManager(RecycleViewActivity.this,LinearLayoutManager.VERTICAL,false);
}
private void initData() {
mData=new ArrayList<String>();
for(int i='A';i<='z';i++){
mData.add(""+(char)i);
}
}
private void initView() {
recyclerView= (RecyclerView) findViewById(R.id.id_recyclview);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main,menu);
// setIconEnable(menu, true);
// MenuItem menu1=menu.add(0,1,0,"添加");
// menu1.setIcon(R.mipmap.add);
//
// MenuItem menu2=menu.add(0,1,0,"删除");
// menu2.setIcon(R.mipmap.add);
return super.onCreateOptionsMenu(menu);
}
//enable为true时,菜单添加图标有效,enable为false时无效。4.0系统默认无效
private void setIconEnable(Menu menu, boolean enable)
{
try
{
Class<?> clazz = Class.forName("com.android.internal.view.menu.MenuBuilder");
Method m = clazz.getDeclaredMethod("setOptionalIconsVisible", boolean.class);
m.setAccessible(true);
//MenuBuilder实现Menu接口,创建菜单时,传进来的menu其实就是MenuBuilder对象(java的多态特征)
m.invoke(menu, enable);
} catch (Exception e)
{
e.printStackTrace();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId())
{ //添加
case R.id.action_add:
adapter.addData(1);
// if(sharePop==null){
// OnClickLintener onClickLintener=new OnClickLintener();
// sharePop=new MySharePop(RecycleViewActivity.this,onClickLintener, DensityUtils.dp2px(this,160),DensityUtils.dp2px(this,160));
// //监听窗口焦点事件点击窗口外面取消显示
// sharePop.getContentView().setOnFocusChangeListener(new View.OnFocusChangeListener() {
// @Override
// public void onFocusChange(View v, boolean hasFocus) {
// if(!hasFocus){
// sharePop.dismiss();
// }
// }
// });
//
// }
// //设置默认焦点
// sharePop.setFocusable(true);
// //以某个控件的x和y的偏移量位置开始显示窗口
// //sharePop.showAsDropDown(,0,0);
// //如果窗口存在,则更新
// sharePop.update();
break;
//删除
case R.id.action_delete:
adapter.removeData(1);
break;
}
return true;
}
// class OnClickLintener implements View.OnClickListener {
//
// @Override
// public void onClick(View v) {
// switch (v.getId()) {
// case R.id.layout_add:
//
// break;
// case R.id.layout_delete:
//
// break;
//
// default:
// break;
// }
}
添加分割线代码
package zm.jc.com.bmobsys.view;
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.util.Log;
import android.view.View;
/**
* Created by John on 2017/1/16.
*/
public class DividerItemDecoration extends RecyclerView.ItemDecoration {
private static final String TAG = "DividerItemDecoration";
private static final int[] ATTRS = new int[]{
android.R.attr.listDivider
};
public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
private Drawable mDivider;
private int mOrientation;
public DividerItemDecoration(Context context, int orientation) {
final TypedArray a = context.obtainStyledAttributes(ATTRS);
mDivider = a.getDrawable(0);
a.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) {
Log.d(TAG, "onDraw() returned: " );
if (mOrientation == VERTICAL_LIST) {
drawVertical(c, parent);
} else {
drawHorizontal(c, parent);
}
}
public void drawVertical(Canvas c, RecyclerView parent) {
final int left = parent.getPaddingLeft();
final int right = parent.getWidth() - parent.getPaddingRight();
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext());
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 drawHorizontal(Canvas c, RecyclerView parent) {
final int top = parent.getPaddingTop();
final 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.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
@Override
public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
if (mOrientation == VERTICAL_LIST) {
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
} else {
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
}
}
}
网格分割线代码
package zm.jc.com.bmobsys.view;
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.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;
/**
* Created by John on 2017/1/16.
*/
public class DividerGridItemDecoration extends RecyclerView.ItemDecoration {
private static final int[] ATTRS = new int[] { android.R.attr.listDivider };
private Drawable mDivider;
public DividerGridItemDecoration(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());
}
}
}
布局文件activity_recycleview
<?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="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/id_recyclview"
android:layout_width="match_parent"
android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
<zm.jc.com.bmobsys.view.MyTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30sp"
android:typeface="sans"
android:gravity="center"
android:text="你是在干嘛"/>
</RelativeLayout>
子itemview item_textview.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="@color/colorAccent"
android:layout_height="72dp">
<TextView
android:id="@+id/tv_textview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="哈哈"
android:gravity="center"/>
</FrameLayout>
美女画廊效果
全部代码
package zm.jc.com.bmobsys;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import zm.jc.com.bmobsys.adapter.GalleryAdapter;
import zm.jc.com.bmobsys.view.CopyRecyview;
/**
* Created by John on 2017/1/16.
*/
public class GalleryActivity extends AppCompatActivity {
GalleryAdapter adapter;
private int[] resId={R.mipmap.add_1,R.mipmap.add_2,
R.mipmap.add_3,
R.mipmap.add_4,
R.mipmap.add_5
};
private ImageView mImg;
private List<Integer> mData;
private RecyclerView recyclerView2;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycleview2);
mImg = (ImageView) findViewById(R.id.id_content);
recyclerView2= (CopyRecyview) findViewById(R.id.id_recyclview2);
initData();
//设置布局管理器
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
recyclerView2.setLayoutManager(linearLayoutManager);
adapter=new GalleryAdapter(GalleryActivity.this,mData);
adapter.setOnItemClickListener(new GalleryAdapter.OnItemClickListener() {
@Override
public void onItemClick(View v, int position) {
Toast.makeText(GalleryActivity.this,"点击增加一张"+position,Toast.LENGTH_LONG).show();
//mImg.setImageResource(mData.get(position));
adapter.addImageData(position);
//adapter.notifyItemInserted(position);
}
});
recyclerView2.setAdapter(adapter);
// LinearLayoutManager llm=new LinearLayoutManager(GalleryActivity.this,3);
}
private void initData(){
mData = new ArrayList<Integer>(Arrays.asList(R.mipmap.add_1,R.mipmap.add_2,
R.mipmap.add_3,
R.mipmap.add_4,
R.mipmap.add_5));
}
}
GalleryAdapter
package zm.jc.com.bmobsys.adapter;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import java.util.List;
import zm.jc.com.bmobsys.R;
/**
* Created by John on 2017/1/16.
*/
public class GalleryAdapter extends RecyclerView.Adapter<GalleryAdapter.GalleryViewHolder> {
private Context mContext;
private LayoutInflater mLayoutInflater;
private OnItemClickListener listener;
private List<Integer> mData;
public interface OnItemClickListener{
void onItemClick(View v,int position);
}
public void setOnItemClickListener( OnItemClickListener listener){
this.listener=listener;
}
private int[] resId={R.mipmap.add_1,R.mipmap.add_2,
R.mipmap.add_3,
R.mipmap.add_4,
R.mipmap.add_5
};
public GalleryAdapter(Context context,int[] resId){
this.mContext=context;
this.resId=resId;
mLayoutInflater=LayoutInflater.from(context);
} public GalleryAdapter(Context context,List<Integer> mData){
this.mContext=context;
this.mData=mData;
//this.resId=resId;
mLayoutInflater=LayoutInflater.from(context);
}
@Override
public GalleryViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view=mLayoutInflater.inflate(R.layout.item_gallery,parent,false);
GalleryViewHolder galleryViewHolder=new GalleryViewHolder(view);
return galleryViewHolder;
}
@Override
public void onBindViewHolder(final GalleryViewHolder holder, final int position) {
holder.imageView.setImageResource(mData.get(position));
//回调
if(listener!=null){
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onItemClick(holder.itemView,position);
}
});
// int pos=holder.getLayoutPosition();
// listener.onItemClick(holder.imageView,pos);
}
}
@Override
public int getItemCount() {
//resId.length;
return mData.size();
}
public class GalleryViewHolder extends RecyclerView.ViewHolder{
ImageView imageView;
//TextView tv_gallery;
public GalleryViewHolder(View itemView) {
super(itemView);
imageView= (ImageView) itemView.findViewById(R.id.iv_gallery);
}
}
public void addImageData(int position){
mData.add(position,mData.get(position));
notifyItemInserted(position);
}
}
不啰嗦!
转载请注明出处,http://blog.csdn.net/qq_15950325/article/details/54582340同时希望老司机加群一起开车!