說起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同時希望老司機加羣一起開車!