[掌盟+]RecycleView实现"英雄资料"页和"发现"页

临近离职日子,在最后不用加班的情况下出去面试了第一家,被问了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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值