1 创建布局文件的时候用到recycleView的时候,如何引用:
<android.support.v7.widget.RecyclerView android:id="@+id/recycler" android:layout_width="match_parent" android:layout_height="match_parent" />
2 在初始化recycleview的时候,需要导包
import android.support.v7.widget.RecyclerView;
3 导入后可能发现不了这个包,因为虽然它是包含在v7包中,但是不一定能发现,所以在studio的项目build.gradle文件中需要加上引用。
compile 'com.android.support:recyclerview-v7:25.2.0+'
加入之后,包也就没问题了。
初始化的时候如果不设置管理者就会不显示任何图像,是不能用的。
大神的方法是:
mRecyclerView = findView(R.id.id_recyclerview);
//设置布局管理器 想listView 一样的列表
mRecyclerView.setLayoutManager(new LinearLayoutManager(this);
//如果像横向显示,并设置横向显示一行条目个数:
//横向显示,一行5个
//recallBinding.recyclerRecallShopstyle.setLayoutManager(new StaggeredGridLayoutManager(5, StaggeredGridLayoutManager.VERTICAL));
mRecyclerView.setHasFixeSize(true);//不解释
//设置adapter
mRecyclerView.setAdapter(adapter);
//设置Item增加、移除动画系统自带的动画,挺漂亮的
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
//添加分割线
mRecyclerView.addItemDecoration(new DividerItemDecoration(
getActivity(), DividerItemDecoration.HORIZONTAL_LIST));
//这个分割线后边也有代码,也是copy鸿翔大神的。
在下使用的是横向显示三张图片,所以用的是下面的方法。
compileBinding.recyclerDynamic.setLayoutManager(new GridLayoutManager(this, 3)); compileBinding.recyclerDynamic.setItemAnimator(new DefaultItemAnimator()); compileBinding.recyclerDynamic.addItemDecoration(new MyDividerGridItemDecoration(CompileActivity.this));
4 我现在只需要recycle的点击事件,需要将adapter单独写成一个类,我在这个类中直接循环了一下做了一个数据源,仅仅是个例子而已。
当然,如果你想在调用的时候直接将数据源数组传递近来,就在构造方法
private Context mcontext;
private List<String> strings;
public HomeAdapter(Context context, List<String> s){
mcontext = context;//传递对象
strings = s;//这样你在调用的时候就可以将数据源传递近来直接赋值使用了
}
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.TextView; import java.util.List; /** * Created by Administrator on 2017/4/6 0006. */ //给recycle设置适配器
public class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder> { private List<String> strings; private Context mcontext; public HomeAdapter(Context context, List<String> strings) { this.mcontext = context; this.strings = strings; } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { MyViewHolder holder = new MyViewHolder(LayoutInflater.from(mcontext).inflate(R.layout.item_recycle, parent, false)); return holder; } public interface OnItemClickLitener { void onItemClick(View view, int position); void onItemLongClick(View view, int position); } private OnItemClickLitener mOnItemClickLitener; public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener) { this.mOnItemClickLitener = mOnItemClickLitener; } @Override public void onBindViewHolder(final MyViewHolder holder, final int position) { if (mOnItemClickLitener != null) { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int pos = holder.getLayoutPosition(); mOnItemClickLitener.onItemClick(holder.itemView, pos); } }); holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { int pos = holder.getLayoutPosition(); mOnItemClickLitener.onItemLongClick(holder.itemView, pos); return false; } }); } } @Override public int getItemCount() { return strings.size(); } class MyViewHolder extends RecyclerView.ViewHolder { public MyViewHolder(View view) { super(view); } } }
public void addItem(int position,String s) { strings.add(position,s); notifyItemInserted(position); } public void removeItem(int position) { strings.remove(position); notifyItemRemoved(position);}
//如果需要添加在数组末尾:
public void addItem(RefillResult.ListBean s) { strings.add(s); notifyItemInserted(strings.size()); } public void removeItem(int position) { strings.remove(position); notifyItemRemoved(position); }
如果条目横向显示三张图片,让每个条目之间的间隔可以控制,就需要手动绘制分割线:
代码可以直接拷贝:
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.RecyclerView.LayoutManager; import android.support.v7.widget.RecyclerView.State; import android.support.v7.widget.StaggeredGridLayoutManager; import android.view.View; /** * * @author zhy * */ public class MyDividerGridItemDecoration extends RecyclerView.ItemDecoration { private static final int[] ATTRS = new int[] { android.R.attr.listDivider }; private Drawable mDivider; public MyDividerGridItemDecoration(Context context) { final TypedArray a = context.obtainStyledAttributes(ATTRS); mDivider = a.getDrawable(0); a.recycle(); } @Override public void onDraw(Canvas c, RecyclerView parent, State state) { drawHorizontal(c, parent); drawVertical(c, parent); } private int getSpanCount(RecyclerView parent) { // 列数 int spanCount = -1; 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) { 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) { 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()); } } }
使用这个类的方法:
拿recycleView的对象,添加就可以了。
recycleCompile.addItemDecoration(new MyDividerGridItemDecoration(CompileActivity.this));
在adapter中有遇到一种情况: 展示的条目中有一个删除按钮,点击之后删除当前点击按钮
如果这个操作在activity或者fargment中,那是相当方便,因为拿到当前点击位置非常容易!
但是如果这个操作在adapter中,怎么拿到当前点击的位置呢?
思路是: 在数据源就是传入这个列表的数据中,对每个条目设定一个唯一身份标识符
在点击删除的时候,遍历整个数组,用for(int i = 0; i < strings.size() ;i++){} 来遍历,这样如果身份相同, i +1 就是这个条目当前所在列表的位置!
int position = 0; for (int i = 0; i < dynamicList.size(); i++) { if (dynamic == dynamicList.get(i)) { position = i; break; }//最重要的地方===》 == 号前后的值要确保 1 类型 2 内容 全部一致,否则,你只能删除0位上的内容
}
拿到位置,用数组删除这个位置的元素,刷新界面. ,当然也可以局部刷新!
到,有的话记者@我
至此结束,谢谢观看。