RecyclerView出现已经有一段时间了,相信大家肯定不陌生了,大家可以通过导入support-v7对其进行使用。
据官方的介绍,该控件用于在有限的窗口中展示大量数据集,其实这样功能的控件我们并不陌生,例如:ListView、GridView。
以下是实现的效果图
1、要用到RecyclerView 我们首先在AndroidStudio的gradle中导入
<span style="font-size:18px;">compile 'com.android.support:recyclerview-v7:23.1.1'</span>
2、用到RecyclerView,Adapter适配器是不能少的,Adapter代码如下:
import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import java.util.ArrayList; public class RecylerAdapter extends RecyclerView.Adapter<RecylerAdapter.ViewHolder> { private OnItemClickListener onItemClickListener; private ArrayList<PersonalItemBean> mList; public RecylerAdapter(OnItemClickListener<PersonalItemBean> onItemClickListener){ this.onItemClickListener = onItemClickListener; initData(); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item,parent,false)); } @Override public void onBindViewHolder(ViewHolder holder, final int position) { final PersonalItemBean personalBean = mList.get(position); holder.mImageView.setImageResource(personalBean.getImageView()); holder.mHindTextView.setText(personalBean.getHind()); holder.mTitleTextView.setText(personalBean.getTitle()); holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { onItemClickListener.onItemClickLister(v,position,personalBean); } }); } @Override public int getItemCount() { return mList.size(); } static class ViewHolder extends RecyclerView.ViewHolder{ ImageView mImageView; TextView mTitleTextView; TextView mHindTextView; public ViewHolder(View itemView) { super(itemView); mImageView = (ImageView) itemView.findViewById(R.id.item_plane); mTitleTextView = (TextView) itemView.findViewById(R.id.item_title); mHindTextView = (TextView) itemView.findViewById(R.id.item_hind); } } private void initData(){ if(mList == null){ mList = new ArrayList<>(); } mList.add(new PersonalItemBean(R.drawable.personal_plane_ico,"我的轨迹","500米")); mList.add(new PersonalItemBean(R.drawable.personal_instructions_ico,"意见反馈","")); mList.add(new PersonalItemBean(R.drawable.personal_recommend_ico,"推荐给好友","赚取积分")); mList.add(new PersonalItemBean(R.drawable.personal_contact,"联系我们","400-1542-755")); mList.add(new PersonalItemBean(R.drawable.pingjia,"给个五星好评","赠送100积分")); mList.add(new PersonalItemBean(R.drawable.setting,"设置","个人喜好一键搞定")); mList.add(new PersonalItemBean(R.drawable.pingjia,"我的收藏","查看手册记录")); mList.add(new PersonalItemBean(R.drawable.personal_contact,"关于我们","")); } }3、因为RecyclerView没有提供类似ListView的OnItemClickListener,所以对Item的点击事件的自己写,下面是OnItemClickListener代码
/**RecyclerView Item 点击回调接口 */ public interface OnItemClickListener<T> { void onItemClickLister(View view, int position, T t); }
它接受三个参数:
view:当前的view
position:当前Item的Position
T:当前Item的Bean对象
在实例化Adapter的时候将 OnItemClickListener当做参数传递给Adapter4、RecyclerView需要设置分割线的,默认情况下是没有分割线,我们自定义分割线DividerItemDecoration继承自RecyclerView.itemDecoration:
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) { 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); } } }
5、好了,到此我们就可以使用RecyclerView了。
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView); RecylerAdapter adapter = new RecylerAdapter(this); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this); mRecyclerView.setAdapter(adapter); mRecyclerView.setLayoutManager(linearLayoutManager); mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));