1.Datas: 要显示的数据
2.Adapter:适配器,绑定数据集
3.ViewHolder:根据当前的数据保存视图
4.LayoutManager:布局管理器。决定item如何摆放
5.ItemDecoration:勉强理解为item装饰器,可以美化item
6. ItemAnimator:动画(当item被增加,删除,重新摆放时动画才有效)。
7. Listener: 事件。RecyclerView本身不提供OnItemClickListener等事件
所需库文件:
compile 'com.android.support:recyclerview-v7:24.2.1'
布局文件:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:custom="http://schemas.android.com/apk/res-auto" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView android:id="@+id/recyclerview" android:layout_width="match_parent" android:layout_height="wrap_content"> </android.support.v7.widget.RecyclerView> </LinearLayout>java文件:
private void initRecyclerView(View view) { mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerview); httpHelper.get(Contants.API.CAMPAIGN_HOME, new BaseCallback<List<HomeCampaign>>() { @Override public void onBeforeRequest(Request request) { } @Override public void onFailure(Request request, Exception e) { } @Override public void onResponse(Response response) { } @Override public void onSuccess(Response response, List<HomeCampaign> homeCampaigns) { initData(homeCampaigns); } @Override public void onError(Response response, int code, Exception e) { } }); } private void initData(List<HomeCampaign> homeCampaigns){ mAdatper = new HomeCatgoryAdapter(homeCampaigns,getActivity()); mAdatper.setOnCampaignClickListener(new HomeCatgoryAdapter.OnCampaignClickListener() { @Override public void onClick(View view, Campaign campaign) { Toast.makeText(getContext(),"title="+campaign.getTitle(),Toast.LENGTH_LONG).show(); } }); mRecyclerView.setAdapter(mAdatper); mRecyclerView.addItemDecoration(new CardViewtemDecortion()); mRecyclerView.setLayoutManager(new LinearLayoutManager(this.getActivity())); }adapter文件:
public class HomeCatgoryAdapter extends RecyclerView.Adapter<HomeCatgoryAdapter.ViewHolder> { private static int VIEW_TYPE_L=0; private static int VIEW_TYPE_R=1; private LayoutInflater mInflater; private List<HomeCampaign> mDatas; private Context mContext; private OnCampaignClickListener mListener; public HomeCatgoryAdapter(List<HomeCampaign> datas,Context context){ mDatas = datas; this.mContext = context; } public void setOnCampaignClickListener(OnCampaignClickListener listener){ this.mListener = listener; } @Override public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int type) { mInflater = LayoutInflater.from(viewGroup.getContext()); if(type == VIEW_TYPE_R){ return new ViewHolder(mInflater.inflate(R.layout.template_home_cardview2,viewGroup,false)); } return new ViewHolder(mInflater.inflate(R.layout.template_home_cardview,viewGroup,false)); } @Override public void onBindViewHolder(ViewHolder viewHolder, int i) { HomeCampaign homeCampaign = mDatas.get(i); viewHolder.textTitle.setText(homeCampaign.getTitle()); Picasso.with(mContext).load(homeCampaign.getCpOne().getImgUrl()).into(viewHolder.imageViewBig); Picasso.with(mContext).load(homeCampaign.getCpTwo().getImgUrl()).into(viewHolder.imageViewSmallTop); Picasso.with(mContext).load(homeCampaign.getCpThree().getImgUrl()).into(viewHolder.imageViewSmallBottom); } @Override public int getItemCount() { return mDatas.size(); } @Override public int getItemViewType(int position) { if(position % 2==0){ return VIEW_TYPE_R; } else return VIEW_TYPE_L; } class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ TextView textTitle; ImageView imageViewBig; ImageView imageViewSmallTop; ImageView imageViewSmallBottom; public ViewHolder(View itemView) { super(itemView); textTitle = (TextView) itemView.findViewById(R.id.text_title); imageViewBig = (ImageView) itemView.findViewById(R.id.imgview_big); imageViewSmallTop = (ImageView) itemView.findViewById(R.id.imgview_small_top); imageViewSmallBottom = (ImageView) itemView.findViewById(R.id.imgview_small_bottom); imageViewBig.setOnClickListener(this); imageViewSmallTop.setOnClickListener(this); imageViewSmallBottom.setOnClickListener(this); } @Override public void onClick(View v) { HomeCampaign homeCampaign = mDatas.get(getLayoutPosition()); if(mListener !=null){ switch (v.getId()){ case R.id.imgview_big: mListener.onClick(v,homeCampaign.getCpOne()); break; case R.id.imgview_small_top: mListener.onClick(v,homeCampaign.getCpTwo()); break; case R.id.imgview_small_bottom: mListener.onClick(v,homeCampaign.getCpThree()); break; } } } } public interface OnCampaignClickListener{ void onClick(View view, Campaign campaign); } }条目分割线文件
public class CardViewtemDecortion extends RecyclerView.ItemDecoration { @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDraw(c, parent, state); } @Override public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDrawOver(c, parent, state); } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { int layoutOrientation = getOrientation(parent); if (layoutOrientation == LinearLayoutManager.VERTICAL) { outRect.top = 10; outRect.left=5; outRect.right=5; } else if(layoutOrientation == LinearLayoutManager.HORIZONTAL) { outRect.left = 5; } } private int getOrientation(RecyclerView parent) { if (parent.getLayoutManager() instanceof LinearLayoutManager) { LinearLayoutManager layoutManager = (LinearLayoutManager) parent.getLayoutManager(); return layoutManager.getOrientation(); } else throw new IllegalStateException("DividerItemDecoration can only be used with a LinearLayoutManager."); } }