[掌盟+]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

0 0
原创粉丝点击