这里要说的是RecyclerView的使用,希望能助你完全理解RecyclerView,把它运用到项目中,当然这里也会提供你简便的写法,要知道每次都写个adapter费时又费力,只能说本人很懒,于是在网上找方法,聪明的你应该知道是怎么做了吧,不错,就是打造一个通用的adapter。这里先卖个关子,要知道就继续往下看吧。
RecyclerView 是Android L版本中新添加的一个可用来替换ListView和GridView的SDK,它的灵活性与可替代性比ListView和GridView更好。能够在有限的窗口中展示大数据集合的灵活视图,这就是所谓的RecyclerView吧。
如果你想使用RecyclerView,你将需要使用以下几点:
*RecyclerView.Adapter – 处理数据收集并将其绑定到视图
*ViewHolder – 持有所有的用于绑定数据或者需要操作的View
*LayoutManager – 负责摆放视图等相关操作
*ItemDecoration – 负责绘制Item附近的分割线
*ItemAnimator – 为item的一般操作添加动画效果,比如添加或删除条目
想看最原始的使用方法,想知道更多的细节,请看这里
如果你实在看不懂英文的话,这篇文章也能很好的说明使用方法,请看这里
这里只给出单种item的示例代码,更多使用方法()可看万能适配器,这里很感谢鸿神的开源,他的博客都很不错,值得学习,各位客官,下面就请听我步步道来:
dependencies {
...
compile 'com.android.support:recyclerview-v7:23.3.0'
}
"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=".MainActivity">
.support.v7.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"/>
public class ViewHolder extends RecyclerView.ViewHolder
{
private SparseArray mViews;
private int mPosition;
private View mConvertView;
private Context mContext;
private int mLayoutId;
public ViewHolder(Context context, View itemView, ViewGroup parent, int position)
{
super(itemView);
mContext = context;
mConvertView = itemView;
mPosition = position;
mViews = new SparseArray();
mConvertView.setTag(this);
}
public static ViewHolder get(Context context, View convertView,
ViewGroup parent, int layoutId, int position)
{
if (convertView == null)
{
View itemView = LayoutInflater.from(context).inflate(layoutId, parent,
false);
ViewHolder holder = new ViewHolder(context, itemView, parent, position);
holder.mLayoutId = layoutId;
return holder;
} else
{
ViewHolder holder = (ViewHolder) convertView.getTag();
holder.mPosition = position;
return holder;
}
}
/**
* 通过viewId获取控件
*
* @param viewId
* @return
*/
public T getView(int viewId)
{
View view = mViews.get(viewId);
if (view == null)
{
view = mConvertView.findViewById(viewId);
mViews.put(viewId, view);
}
return (T) view;
}
public View getConvertView()
{
return mConvertView;
}
/**
* 设置TextView的值
*
* @param viewId
* @param text
* @return
*/
public ViewHolder setText(int viewId, String text)
{
TextView tv = getView(viewId);
tv.setText(text);
return this;
}
public ViewHolder setImageResource(int viewId, int resId)
{
ImageView view = getView(viewId);
view.setImageResource(resId);
return this;
}
public ViewHolder setImageBitmap(int viewId, Bitmap bitmap)
{
ImageView view = getView(viewId);
view.setImageBitmap(bitmap);
return this;
}
public ViewHolder setImageDrawable(int viewId, Drawable drawable)
{
ImageView view = getView(viewId);
view.setImageDrawable(drawable);
return this;
}
public ViewHolder setBackgroundColor(int viewId, int color)
{
View view = getView(viewId);
view.setBackgroundColor(color);
return this;
}
public ViewHolder setBackgroundRes(int viewId, int backgroundRes)
{
View view = getView(viewId);
view.setBackgroundResource(backgroundRes);
return this;
}
public ViewHolder setTextColor(int viewId, int textColor)
{
TextView view = getView(viewId);
view.setTextColor(textColor);
return this;
}
public ViewHolder setTextColorRes(int viewId, int textColorRes)
{
TextView view = getView(viewId);
view.setTextColor(mContext.getResources().getColor(textColorRes));
return this;
}
@SuppressLint("NewApi")
public ViewHolder setAlpha(int viewId, float value)
{
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
{
getView(viewId).setAlpha(value);
} else
{
// Pre-honeycomb hack to set Alpha value
AlphaAnimation alpha = new AlphaAnimation(value, value);
alpha.setDuration(0);
alpha.setFillAfter(true);
getView(viewId).startAnimation(alpha);
}
return this;
}
public ViewHolder setVisible(int viewId, boolean visible)
{
View view = getView(viewId);
view.setVisibility(visible ? View.VISIBLE : View.GONE);
return this;
}
public ViewHolder linkify(int viewId)
{
TextView view = getView(viewId);
Linkify.addLinks(view, Linkify.ALL);
return this;
}
public ViewHolder setTypeface(Typeface typeface, int... viewIds)
{
for (int viewId : viewIds)
{
TextView view = getView(viewId);
view.setTypeface(typeface);
view.setPaintFlags(view.getPaintFlags() | Paint.SUBPIXEL_TEXT_FLAG);
}
return this;
}
public ViewHolder setProgress(int viewId, int progress)
{
ProgressBar view = getView(viewId);
view.setProgress(progress);
return this;
}
public ViewHolder setProgress(int viewId, int progress, int max)
{
ProgressBar view = getView(viewId);
view.setMax(max);
view.setProgress(progress);
return this;
}
public ViewHolder setMax(int viewId, int max)
{
ProgressBar view = getView(viewId);
view.setMax(max);
return this;
}
public ViewHolder setRating(int viewId, float rating)
{
RatingBar view = getView(viewId);
view.setRating(rating);
return this;
}
public ViewHolder setRating(int viewId, float rating, int max)
{
RatingBar view = getView(viewId);
view.setMax(max);
view.setRating(rating);
return this;
}
public ViewHolder setTag(int viewId, Object tag)
{
View view = getView(viewId);
view.setTag(tag);
return this;
}
public ViewHolder setTag(int viewId, int key, Object tag)
{
View view = getView(viewId);
view.setTag(key, tag);
return this;
}
public ViewHolder setChecked(int viewId, boolean checked)
{
Checkable view = (Checkable) getView(viewId);
view.setChecked(checked);
return this;
}
/**
* 关于事件的
*/
public ViewHolder setOnClickListener(int viewId,
View.OnClickListener listener)
{
View view = getView(viewId);
view.setOnClickListener(listener);
return this;
}
public ViewHolder setOnTouchListener(int viewId,
View.OnTouchListener listener)
{
View view = getView(viewId);
view.setOnTouchListener(listener);
return this;
}
public ViewHolder setOnLongClickListener(int viewId,
View.OnLongClickListener listener)
{
View view = getView(viewId);
view.setOnLongClickListener(listener);
return this;
}
public void updatePosition(int position)
{
mPosition = position;
}
public int getLayoutId()
{
return mLayoutId;
}
}
public abstract class CommonAdapter extends RecyclerView.Adapter
{
protected Context mContext;
protected int mLayoutId;
protected List mDatas;
protected LayoutInflater mInflater;
private OnItemClickListener mOnItemClickListener;
public void setOnItemClickListener(OnItemClickListener onItemClickListener)
{
this.mOnItemClickListener = onItemClickListener;
}
public CommonAdapter(Context context, int layoutId, List datas)
{
mContext = context;
mInflater = LayoutInflater.from(context);
mLayoutId = layoutId;
mDatas = datas;
}
@Override
public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType)
{
ViewHolder viewHolder = ViewHolder.get(mContext, null, parent, mLayoutId, -1);
setListener(parent, viewHolder, viewType);
return viewHolder;
}
protected int getPosition(RecyclerView.ViewHolder viewHolder)
{
return viewHolder.getAdapterPosition();
}
protected boolean isEnabled(int viewType)
{
return true;
}
protected void setListener(final ViewGroup parent, final ViewHolder viewHolder, int viewType)
{
if (!isEnabled(viewType)) return;
viewHolder.getConvertView().setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if (mOnItemClickListener != null)
{
int position = getPosition(viewHolder);
mOnItemClickListener.onItemClick(parent, v, mDatas.get(position), position);
}
}
});
viewHolder.getConvertView().setOnLongClickListener(new View.OnLongClickListener()
{
@Override
public boolean onLongClick(View v)
{
if (mOnItemClickListener != null)
{
int position = getPosition(viewHolder);
return mOnItemClickListener.onItemLongClick(parent, v, mDatas.get(position), position);
}
return false;
}
});
}
@Override
public void onBindViewHolder(ViewHolder holder, int position)
{
holder.updatePosition(position);
convert(holder, mDatas.get(position));
}
public abstract void convert(ViewHolder holder, T t);
@Override
public int getItemCount()
{
return mDatas.size();
}
}
对了,别忘了给item添加点击处理
public interface OnItemClickListener {
void onItemClick(ViewGroup parent, View view, T t, int position);
boolean onItemLongClick(ViewGroup parent, View view, T t, int position);
}
初始化组件
mRecyclerView = (RecyclerView)findViewById(R.id.my_recycler_view);
//创建默认的线性LayoutManager
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
//如果可以确定每个item的高度是固定的,设置这个选项可以提高性能
mRecyclerView.setHasFixedSize(true);
//设置分割线
mRecyclerView..addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
分割线
public class DividerItemDecoration extends RecyclerView.ItemDecoration{
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, RecyclerView.State state) {
if(mOrientation == VERTICAL_LIST){
drawVertical(c, parent);
}else{
drawHorizontal(c, parent);
}
}
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);
}
}
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);
RecyclerView v = new 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);
}
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
if(mOrientation == VERTICAL_LIST){
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
}else {
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
}
}
}
设置adapter,这里的String可根据你项目要求换成你所需的Bean都行
mRecyclerView.setAdapter(new CommonAdapter(this, R.layout.item_list, mDatas)
{
@Override
public void convert(ViewHolder holder, String s)
{
holder.setText(R.id.id_item_list_title, s);
}
});
以上就是RecyclerView的简便使用了,如果要在一个页面再新建一个RecyclerView,只需要在activity或fragment中直接setAdapter()调用通用适配器,这样可以简便很多,那么有了上面的代码后,你知道怎么添加多选功能吗?如不清楚,再听我慢慢道来:
/**
* 选择item
* 实现多选
*/
public ViewHolder setSelectListener(int viewId,
View.OnClickListener listener)
{
View view = getView(viewId);
view.setOnClickListener(listener);
return this;
}
private SparseBooleanArray selectedItems;//记录选中的position
/**
* 判读是否选中
*/
public boolean isSelected(int position){
return getSelectedItems().contains(position);
}
/**
* 切换选中或取消选中
*/
public void switchSelectedState(int position){
if(selectedItems.get(position, false)){
selectedItems.delete(position);
}else{
selectedItems.put(position,true);
}
notifyItemChanged(position);
}
/**
* 清除所有选中item的标记
*/
public void clearSelectedState(){
List selection = getSelectedItems();
selectedItems.clear();
for(Integer i : selection){
notifyItemChanged(i);
}
}
/**
* 全选
*/
public void selectAllItems(){
clearSelectedState();
for(int i = 0; i < getItemCount(); i++){
selectedItems.put(i,true);
notifyItemChanged(i);
}
}
/**
* 获取item数目
*/
public int getSelectedItemCount(){
return selectedItems.size();
}
/**
* 获取选中的items
*/
public List getSelectedItems(){
List items = new ArrayList<>(selectedItems.size());
for(int i = 0; i < selectedItems.size(); i++){
items.add(selectedItems.keyAt(i));
}
return items;
}
最后在setAdapter时实现你多选的效果
//设置选中状态
if(omsAdapter.isSelected(holder.getItemPosition())) {
holder.setImageResource(R.id.img_isSelect, R.drawable.choiced_ic);
}else{
holder.setImageResource(R.id.img_isSelect, R.drawable.no_choice_ic);
}
//设置选中事件
holder.setSelectListener(R.id.img_isSelect, new View.OnClickListener() {
@Override
public void onClick(View v) {
omsAdapter.switchSelectedState(holder.getItemPosition());//切换选中
}
});
以上就是本次博客的所有内容了,有误请各位客官指出,在下会继续虚心学习,虽然本人有点懒,但是只要有简便方法实现所需功能又不失性能,则会选择去重构。