[掌盟+]RecycleView实现"英雄资料"页和"发现"页
2017-04-29 23:04
337 查看
临近离职日子,在最后不用加班的情况下出去面试了第一家,被问了RecycleView,好吧,我现在的厂没有使用,还是使用ListView和GridView。那现在就用下这个来实现下掌盟的英雄资料页面
WE 3:0 成功每一盘都翻盘RNG,恭喜WE
一、效果图:
1.官方:
2.高(shan)仿(zhai)
二、RecycleView的使用
1.build.gradle添加依赖:
2.布局添加RecycleView:
以”发现”页的俱乐部横向列表为例:layout_club.xml
3.初始化RecycleView相关:
3.1看下源码:
默认建立是一个垂直列表,并且数据从头到尾,可以通过
setOrientation()改变横向/竖向;setReverseLayout()改变数据从头到尾/从尾到头
4.实现Adapter:
4.0 新建的Adapter必须继承
4.1 需要实现这个抽象类的三个方法:
4.2 当然Adapter免不了要有上下文和数据源,那就先简单写一个commAdapter封装一下,具体如下:
ClubAdapter.java
5.实现item点击事件
5.0 在
5.1 在
5.2 使用就和之前用ListView的item点击事件一样
6.实现item不同布局:
6.0 Recylce提供三种布局管理器:线性-LinearLayoutManager, 网格-GridLayoutManager,流式-StaggeredGridLayoutManager,都可以横向竖向
6.1 不同的布局在
6.2 那就重写一下
6.3 源码中默认返回 0 :
6.4 以“我的英雄”页为例:
7.数据绑定:
7.0好像都是只是测试数据没有请求网络,之后再加入…
三、源码已经上传GitHub,链接:
https://github.com/scauzhangpeng/LPL
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
相关文章推荐
- 如何在RecyclerView上面实现"拖放"和"滑动删除"-1
- 如何在RecyclerView上面实现"拖放"和"滑动删除"-2
- 如何在RecyclerView上面实现"拖放"和"滑动删除"-2
- 图解用"MySQL Administrator"工具实现自动备份数据库
- 封装 JMail 4.4 的 POP3 为 .Net 组件 (.dll 程序集),实现 "邮件(附件) 到达" 等 "事件"!
- "ORA-01460: 转换请求无法实现或不合理"及C#操作Blob总结
- 采用一个自创的"验证框架"实现对数据实体的验证[编程篇]
- 封装 JMail 4.4 的 POP3 为 .Net 组件 (.dll 程序集),实现 "邮件(附件) 到达" 等 "事件,c#接收邮件
- 使用"函数递归"实现的树型菜单
- 采用一个自创的"验证框架"实现对数据实体的验证[扩展篇]
- 使用LinqDataSource出现“找不到与ViewState中存储的原始值中的给定键相匹配的行,请确保"keys"字典包含与上一个Select操作返回的行对应的唯一键值”错误的解决办法
- inotify + rsync 使用触发同步机制 实现文件 "实时同步"
- 采用一个自创的"验证框架"实现对数据实体的验证[改进篇]
- vbs:一段比较精简的代码实现取得字符串的"字节"数
- 通过分层来体现 "有一个" 或 "用...来实现"
- GridView实现 "插入" 编辑更新删除功能
- 发现 ASP.Net 的一个关于"回车提交"的 Bug ? 必须多于一个 Text 域"回车提交",Server: ButtonX_Click 才能截获!
- 用javascript实现文本框和"选择"按扭之间的间距
- ASP.NET页面中的"__VIEWSTATE"隐藏域
- 如何使 FlashGet "正常合法" 下载 Session 中的自定义文件链接呢? JSP/Servlet 实现!