[掌盟+]RecycleView实现"英雄资料"页和"发现"页
来源:互联网 发布:mac安装axure出错 编辑:程序博客网 时间:2024/06/02 18:04
临近离职日子,在最后不用加班的情况下出去面试了第一家,被问了RecycleView,好吧,我现在的厂没有使用,还是使用ListView和GridView。那现在就用下这个来实现下掌盟的英雄资料页面
WE 3:0 成功每一盘都翻盘RNG,恭喜WE
一、效果图:
1.官方:
2.高(shan)仿(zhai)
二、RecycleView的使用
1.build.gradle添加依赖:
compile 'com.android.support:recyclerview-v7:25.3.1'
2.布局添加RecycleView:
以”发现”页的俱乐部横向列表为例:layout_club.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="30dp" android:orientation="vertical"> <android.support.v7.widget.RecyclerView android:id="@+id/rv_clubs" android:layout_width="match_parent" android:layout_height="match_parent"></android.support.v7.widget.RecyclerView></LinearLayout>
3.初始化RecycleView相关:
private void initViewClub() { //布局管理器 mLinearLayoutManager = new LinearLayoutManager(getActivity()); //设置为横向列表 mLinearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL); //添加布局管理器 mRvClubs.setLayoutManager(mLinearLayoutManager); mClubs = new ArrayList<>(); //随便来几个数据,Ctrl + D mClubs.add(new Club()); mClubs.add(new Club()); mClubs.add(new Club()); mClubs.add(new Club()); mClubs.add(new Club()); mClubs.add(new Club()); mClubs.add(new Club()); mClubs.add(new Club()); mClubs.add(new Club()); mClubs.add(new Club()); //适配器 mClubAdapter = new ClubAdapter(mClubs, getActivity()); //添加适配器 mRvClubs.setAdapter(mClubAdapter); //添加item点击事件 mClubAdapter.setOnItemClickListener(new ClubAdapter.OnItemClickListener() { @Override public void onItemClick(View view, int position) { Toast.makeText(getActivity(), "position:" + position, Toast.LENGTH_SHORT).show(); } }); }
3.1看下源码:
/** * Creates a vertical LinearLayoutManager * * @param context Current context, will be used to access resources. */ public LinearLayoutManager(Context context) { this(context, VERTICAL, false); } /** * @param context Current context, will be used to access resources. * @param orientation Layout orientation. Should be {@link #HORIZONTAL} or {@link * #VERTICAL}. * @param reverseLayout When set to true, layouts from end to start. */ public LinearLayoutManager(Context context, int orientation, boolean reverseLayout) { setOrientation(orientation); setReverseLayout(reverseLayout); setAutoMeasureEnabled(true); }
默认建立是一个垂直列表,并且数据从头到尾,可以通过
setOrientation()改变横向/竖向;setReverseLayout()改变数据从头到尾/从尾到头
4.实现Adapter:
4.0 新建的Adapter必须继承RecycleView.Adatper<VH extends ViewHolder>
4.1 需要实现这个抽象类的三个方法:
public abstract int getItemCount();
public abstract void onBindViewHolder(VH holder, int position);
public abstract VH onCreateViewHolder(ViewGroup parent, int viewType);
4.2 当然Adapter免不了要有上下文和数据源,那就先简单写一个commAdapter封装一下,具体如下:
/** * Created by ZP on 2017/4/29. */public abstract class CommAdapter<T, VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH> { protected List<T> mList; protected Context mContext; public CommAdapter(List<T> list, Context context) { mList = list; mContext = context; } @Override public int getItemCount() { return mList == null ? 0 : mList.size(); }}
ClubAdapter.java
public class ClubAdapter extends CommAdapter<Club, ClubAdapter.ClubViewHolder> implements View.OnClickListener{ public ClubAdapter(List<Club> list, Context context) { super(list, context); } @Override public ClubViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(mContext).inflate(R.layout.item_club, parent, false); ClubViewHolder viewHolder = new ClubViewHolder(view); view.setOnClickListener(this); return viewHolder; } @Override public void onBindViewHolder(ClubViewHolder holder, int position) { holder.mImageView.setImageDrawable(mContext.getResources().getDrawable(R.drawable.team_club_6)); holder.mTextView.setText("EDG"); holder.itemView.setTag(position); } @Override public void onClick(View v) { if (mOnItemClickListener != null) { mOnItemClickListener.onItemClick(v, (int) v.getTag()); } } public OnItemClickListener mOnItemClickListener; public interface OnItemClickListener { void onItemClick(View view, int position); } public void setOnItemClickListener(OnItemClickListener listener) { this.mOnItemClickListener = listener; } class ClubViewHolder extends RecyclerView.ViewHolder { private ImageView mImageView; private TextView mTextView; public ClubViewHolder(View view) { super(view); mImageView = (ImageView) itemView.findViewById(R.id.iv_club_icon); mTextView = (TextView) itemView.findViewById(R.id.tv_club_name); } }}
5.实现item点击事件
5.0 在onCreateViewHolder
方法绑定点击监听
5.1 在onBindViewHolder
方法set个Tag,为了返回position
5.2 使用就和之前用ListView的item点击事件一样
6.实现item不同布局:
6.0 Recylce提供三种布局管理器:线性-LinearLayoutManager, 网格-GridLayoutManager,流式-StaggeredGridLayoutManager,都可以横向竖向
6.1 不同的布局在onCreateViewHolder(ViewGroup parent, int viewType);
方法根据viewType判断
6.2 那就重写一下getItemViewType(int position)
方法
6.3 源码中默认返回 0 :
/** * Return the view type of the item at <code>position</code> for the purposes * of view recycling. * * <p>The default implementation of this method returns 0, making the assumption of * a single view type for the adapter. Unlike ListView adapters, types need not * be contiguous. Consider using id resources to uniquely identify item view types. * * @param position position to query * @return integer value identifying the type of the view needed to represent the item at * <code>position</code>. Type codes need not be contiguous. */ public int getItemViewType(int position) { return 0; }
6.4 以“我的英雄”页为例:
/** * Created by ZP on 2017/4/29. */public class MyHeroAdapter extends CommAdapter<Hero, MyHeroAdapter.MyHeroViewHolder> { private int TYPE_HERO = 1; private int TYPE_FOOT_TIP = 2; public MyHeroAdapter(List<Hero> list, Context context) { super(list, context); } @Override public MyHeroViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == TYPE_FOOT_TIP) { View view = LayoutInflater.from(mContext).inflate(R.layout.item_tip_hero_data, parent, false); MyHeroViewHolder viewHolder = new MyHeroViewHolder(view); return viewHolder; } else { View view = LayoutInflater.from(mContext).inflate(R.layout.item_my_hero, parent, false); MyHeroViewHolder viewHolder = new MyHeroViewHolder(view); return viewHolder; } } @Override public int getItemCount() { return super.getItemCount() + 1; } @Override public int getItemViewType(int position) { if (position == getItemCount() - 1) { return TYPE_FOOT_TIP; } else { return TYPE_HERO; } } @Override public void onBindViewHolder(MyHeroViewHolder holder, int position) { } class MyHeroViewHolder extends RecyclerView.ViewHolder { public MyHeroViewHolder(View itemView) { super(itemView); } }}
7.数据绑定:
7.0好像都是只是测试数据没有请求网络,之后再加入…
三、源码已经上传GitHub,链接:
https://github.com/scauzhangpeng/LPL
- [掌盟+]RecycleView实现"英雄资料"页和"发现"页
- RecycleView实现侧滑和拖动
- RecycleView实现侧滑和拖动
- RecycleView的基本配置和使用方法(四)---RecycleView实现简单demo
- PullToReFresh 实现 RecycleView 横向滑动的刷新和加载更多
- RecycleView实现ListView和GridView,用menu菜单分别显示
- SwipeRefreshLayout +RecycleView实现上拉加载更多和下拉刷新
- RecycleView 底部按钮实现
- RecycleView实现瀑布流
- RecycleView监听实现
- RecycleView 动画实现
- RecycleView的简单实现
- RecycleView实现footer功能
- RecycleView的实现
- RecycleView实现多布局
- Recycleview实现瀑布流
- recycleview实现瀑布流
- recycleview实现gridview功能
- 关于生存
- Windows Service服务程序的原理及实现(1)实现对服务的控制和管理
- 边城小猿——某小城程序员15年的工作经历(已转行)
- 四元数表示向量V1到V2的旋转
- 学习理论、模型选择、特征选择——斯坦福CS229机器学习个人总结(四)
- [掌盟+]RecycleView实现"英雄资料"页和"发现"页
- 《产品经理方法论》
- STM32笔记0428/建立模板
- 关于Android源码的获取
- 4.29面试总结
- LeetCode 130. Surrounded Regions (并查集)
- POJ 3159 Candies(差分规划+SPFA)
- openvpn通过ldap或ad统一认证解决方案思路分享
- 学习淘淘商城第三十七课(中文分析器IK-Analyzer的使用)