RecyclerView的基本使用

来源:互联网 发布:淘宝直播截图抽奖技巧 编辑:程序博客网 时间:2024/06/10 21:50

一、添加gradle依赖。

二、RecyclerView实现垂直滚动的列表:

1.RecyclerView适配器:

public class BombAdapter extends RecyclerView.Adapter<BombAdapter.ViewHolder>{    private List<Bomb> mList;    private Context mContext;    public BombAdapter (Context context,List<FruitBean> list){        mList = list;        mContext = context;    }    @Override    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        LayoutInflater inflater = LayoutInflater.from(mContext);        View view = inflater.inflate(R.layout.item,null);        ViewHolder viewHolder = new ViewHolder(view);        return viewHolder;    }    @Override    public void onBindViewHolder(ViewHolder holder, int position) {        Bomb bomb = mList.get(position);        holder.imageView.setImageResource(bomb .imageId);        holder.textView.setText(bomb .fruitName);    }    @Override    public int getItemCount() {        return mList.size();    }    static class ViewHolder extends RecyclerView.ViewHolder{        ImageView imageView;        TextView textView;        public ViewHolder(View itemView) {            super(itemView);            imageView = (ImageView) itemView.findViewById(R.id.imageView);            textView = (TextView) itemView.findViewById(R.id.textView);        }    }}

2.MainActivity代码:

public class MainActivity extends Activity {    private RecyclerView recyclerView;    private List<Bomb> bombList = new ArrayList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initData();        initView();    }    private void initData() {        for (int i=0;i<2;i++){            Bomb bomb5 = new Bomb("我是bomb 1 哦",R.drawable.bomb5);            bombList.add(bomb5);            Bomb bomb6 = new Bomb("我是bomb 2 哦",R.drawable.bomb6);            bombList.add(bomb6);            Bomb bomb7 = new Bomb("我是bomb 3 哦",R.drawable.bomb7);            bombList.add(bomb7);            Bomb bomb8 = new Bomb("我是bomb 4 哦",R.drawable.bomb8);            bombList.add(bomb8);            Bomb bomb9 = new Bomb("我是bomb 5 哦",R.drawable.bomb9);            bombList.add(bomb9);            Bomb bomb10 = new Bomb("我是bomb 6 哦",R.drawable.bomb10);            bombList.add(bomb10);            Bomb bomb11 = new Bomb("我是bomb 7 哦",R.drawable.bomb11);            bombList.add(bomb11);            Bomb bomb12 = new Bomb("我是bomb 8 哦",R.drawable.bomb12);            bombList.add(bomb12);            Bomb bomb13 = new Bomb("我是bomb 9 哦",R.drawable.bomb13);            bombList.add(bomb13);            Bomb bomb14 = new Bomb("我是bomb 10 哦",R.drawable.bomb14);            bombList.add(bomb14);            Bomb bomb15 = new Bomb("我是bomb 11 哦",R.drawable.bomb15);            bombList.add(bomb15);            Bomb bomb16 = new Bomb("我是bomb 12 哦",R.drawable.bomb16);            bombList.add(bomb16);        }    }    private void initView() {        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);        //设置recyclerView的布局方式为线性布局         LinearLayoutManager layoutManager = new LinearLayoutManager(this);        recyclerView.setLayoutManager(layoutManager);        //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能        recyclerView.setHasFixedSize(true);        BombAdapter adapter = new BombAdapter(this,bombList);        recyclerView.setAdapter(adapter);    }} 

运行效果:
这里写图片描述

发现此列表是没有分割线的,当然加分割线是很简单的,完全可以在Item的布局里加水平的view,这里写个别的方法添加分割线。

先写个分割线的类:

 public class DividerLine extends RecyclerView.ItemDecoration{    /**     * 水平方向     */    public static final int HORIZONTAL = LinearLayoutManager.HORIZONTAL;    /**     * 垂直方向     */    public static final int VERTICAL = LinearLayoutManager.VERTICAL;    // 画笔    private Paint paint;    // 布局方向    private int orientation;    // 分割线颜色    private int color;    // 分割线尺寸    private int size;    public DividerLine() {        this(VERTICAL);    }    public DividerLine(int orientation) {        this.orientation = orientation;        paint = new Paint();    }    @Override    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {        super.onDrawOver(c, parent, state);        if (orientation == VERTICAL) {            drawHorizontal(c, parent);        } else {            drawVertical(c, parent);        }    }    /**     * 设置分割线颜色     *     * @param color 颜色     */    public void setColor(int color) {        this.color = color;        paint.setColor(color);    }    /**     * 设置分割线尺寸     *     * @param size 尺寸     */    public void setSize(int size) {        this.size = size;    }    // 绘制垂直分割线    protected void drawVertical(Canvas c, RecyclerView parent) {        final int top = parent.getPaddingTop();        final int bottom = parent.getHeight() - parent.getPaddingBottom();        final int childCount = parent.getChildCount();        for (int i = 0; i < childCount; i++) {            final View child = parent.getChildAt(i);            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();            final int left = child.getRight() + params.rightMargin;            final int right = left + size;            c.drawRect(left, top, right, bottom, paint);        }    }    // 绘制水平分割线    protected void drawHorizontal(Canvas c, RecyclerView parent) {        final int left = parent.getPaddingLeft();        final int right = parent.getWidth() - parent.getPaddingRight();        final int childCount = parent.getChildCount();        for (int i = 0; i < childCount; i++) {            final View child = parent.getChildAt(i);            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();            final int top = child.getBottom() + params.bottomMargin;            final int bottom = top + size;            c.drawRect(left, top, right, bottom, paint);        }    }}

代码中使用此分割线的类:

 private void initView() {        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);//设置recyclerView的布局的排列方向为纵向,默认为纵向        LinearLayoutManager layoutManager = new LinearLayoutManager(this);        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);        recyclerView.setLayoutManager(layoutManager);        //如果可以确定每个item的高度是固定的,设置这个选项可以提高性能        recyclerView.setHasFixedSize(true);        //用系统默认的分割线:mRecyclerView.addItemDecoration(new DividerItemDecoration(                getActivity(), DividerItemDecoration.HORIZONTAL_LIST));        //添加自定义分割线        DividerLine dividerLine = new DividerLine(DividerLine.VERTICAL);        dividerLine.setSize(2);        dividerLine.setColor(getResources().getColor(R.color.dividerLine));        recyclerView.addItemDecoration(dividerLine);        BombAdapter adapter = new BombAdapter(this,bombList);        recyclerView.setAdapter(adapter);    }

在运行,发现分割线出来了:
这里写图片描述

三、实现RecyclerView的横向滚动的列表:

1.先将item布局改成垂直:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="60dp"     android:layout_height="match_parent"    android:gravity="center_horizontal">    <ImageView        android:id="@+id/imageView"        android:layout_width="50dp"        android:layout_height="50dp" />    <TextView        android:id="@+id/textView"        android:layout_marginTop="5dp"        android:gravity="center"        android:textSize="16sp"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></LinearLayout> 

2.MainActivity代码的innitVIew()方法加一句就ok:

private void initView() {        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);        LinearLayoutManager layoutManager = new LinearLayoutManager(this);        //设置recyclerView的布局的排列方向为横向        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);        //设置recyclerView的布局方式为线性布局,默认布局的排列方向为横向为纵向排列        recyclerView.setLayoutManager(layoutManager);        BombAdapter adapter = new BombAdapter(this,bombList);        recyclerView.setAdapter(adapter);    }

运行:
这里写图片描述

四、实现RecyclerView的瀑布流布局:

1.将item布局改为:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:layout_margin="5dp">    <ImageView        android:id="@+id/imageView"        android:layout_width="100dp"        android:layout_height="100dp"        android:layout_gravity="center_horizontal"/>    <TextView        android:id="@+id/textView"        android:layout_marginTop="10dp"        android:layout_width="wrap_content"        android:layout_height="wrap_content"         android:layout_gravity="left"/></LinearLayout>

2.将recyclerView的布局方式改为瀑布流布局,MainActivity代码:

public class MainActivity extends Activity {    private RecyclerView recyclerView;    private List<Bomb> bombList = new ArrayList<>();    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initData();        initView();    }    private void initData() {        for (int i=0;i<2;i++){            Bomb bomb5 = new Bomb(getRandomLengthName("bomb1"),R.drawable.bomb5);            bombList.add(bomb5);            Bomb bomb6 = new Bomb(getRandomLengthName("bomb2"),R.drawable.bomb6);            bombList.add(bomb6);            Bomb bomb7 = new Bomb(getRandomLengthName("bomb3"),R.drawable.bomb7);            bombList.add(bomb7);            Bomb bomb8 = new Bomb(getRandomLengthName("bomb4"),R.drawable.bomb8);            bombList.add(bomb8);            Bomb bomb9 = new Bomb(getRandomLengthName("bomb5"),R.drawable.bomb9);            bombList.add(bomb9);            Bomb bomb10 = new Bomb(getRandomLengthName("bomb6"),R.drawable.bomb10);            bombList.add(bomb10);            Bomb bomb11 = new Bomb(getRandomLengthName("bomb7"),R.drawable.bomb11);            bombList.add(bomb11);            Bomb bomb12 = new Bomb(getRandomLengthName("bomb8"),R.drawable.bomb12);            bombList.add(bomb12);            Bomb bomb13 = new Bomb(getRandomLengthName("bomb9"),R.drawable.bomb13);            bombList.add(bomb13);            Bomb bomb14 = new Bomb(getRandomLengthName("bomb10"),R.drawable.bomb14);            bombList.add(bomb14);            Bomb bomb15 = new Bomb(getRandomLengthName("bomb11"),R.drawable.bomb15);            bombList.add(bomb15);            Bomb bomb16 = new Bomb(getRandomLengthName("bomb12"),R.drawable.bomb16);            bombList.add(bomb16);        }    }    private void initView() {        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);        //第一个参数指定布局的列数为3,第二个参数指定布局排列方向        //若指定排列方向为横向,则显示三行的横向瀑布流        StaggeredGridLayoutManager layoutManager =                new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);        recyclerView.setLayoutManager(layoutManager);        BombAdapter adapter = new BombAdapter(this,bombList);        recyclerView.setAdapter(adapter);    }    //获得名字的随机长度    private String getRandomLengthName(String name){        Random random = new Random();        int length = random.nextInt(20)+1;        StringBuilder sb = new StringBuilder();        for (int i=0;i<length;i++){            sb.append(name);        }        return sb.toString();    }}

运行:
这里写图片描述

五、实现recyclerView的网格布局:
将 StaggeredGridLayoutManager layoutManager =
new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL);
改为
GridLayoutManager layoutManager = new GridLayoutManager(this,3);
即可。运行:
这里写图片描述

六、RecyclerView的点击事件:

RecyclerView需要我们自己给子项具体的View去注册点击事件。请看修改以后的BombAdapter代码:

public class BombAdapter extends RecyclerView.Adapter<BombAdapter.ViewHolder>{    private List<Bomb> mList;    private Context mContext;    public BombAdapter(Context context, List<Bomb> list){        mList = list;        mContext = context;    }    @Override    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        LayoutInflater inflater = LayoutInflater.from(mContext);        View view = inflater.inflate(R.layout.item ,null);        final ViewHolder viewHolder = new ViewHolder(view);        //为itemView设置点击事件        viewHolder.bombView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //这句很重要                int position = viewHolder.getAdapterPosition();                Toast.makeText(mContext, "你点击了itemVIew----" +                         mList.get(position).fruitName, Toast.LENGTH_SHORT).show();            }        });        //为imageView设置点击事件        viewHolder.imageView.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //这句很重要                int position = viewHolder.getAdapterPosition();                Toast.makeText(mContext, "你点击了imageVIew----" +                        mList.get(position).fruitName, Toast.LENGTH_SHORT).show();            }        });        return viewHolder;    }    @Override    public void onBindViewHolder(ViewHolder holder, int position) {        Bomb bomb = mList.get(position);        holder.imageView.setImageResource(bomb.imageId);        holder.textView.setText(bomb.fruitName);    }    @Override    public int getItemCount() {        return mList.size();    }    static class ViewHolder extends RecyclerView.ViewHolder{        View bombView;         ImageView imageView;        TextView textView;        public ViewHolder(View itemView) {            super(itemView);            bombView = itemView;            imageView = (ImageView) itemView.findViewById(R.id.imageView);            textView = (TextView) itemView.findViewById(R.id.textView);        }    }}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 大货车电瓶亏电怎么办 货车电瓶被偷了怎么办 小乌龟尾巴断了怎么办 长青春痘怎么办简单小妙招 一关灯就有蚊子怎么办 狗狗误食蟑螂药怎么办 泰迪误食蟑螂药怎么办 猫咪吃了蟑螂药怎么办 狗把蟑螂药吃了怎么办 猫吃了蟑螂诱饵怎么办 猫吃了蟑螂中毒怎么办 孕妇胃烧的难受怎么办 6个月孕妇胃难受怎么办 飞机杯吸盘不上怎么办 我的车位被占用怎么办 占别人车位的车怎么办 头受凉受风了疼怎么办 看电脑时间长了眼睛疼怎么办 电脑玩久了头疼怎么办 屋里有死老鼠味怎么办 老鼠死在车里面怎么办 手机锁屏怎么办求解锁 玩lol左键失灵怎么办 小米鼠标没电了怎么办 电脑键盘鼠标没反应怎么办 win10玩游戏很卡怎么办 鞋子夹脚怎么办小妙招 新鞋两边夹脚怎么办 新鞋子两边夹脚怎么办 鞋子瘦两边夹脚怎么办 鞋子小脚趾磨脚怎么办 鞋子买小了顶脚怎么办 鼠标不亮了怎么办呢 坐便水箱不上水怎么办 2个shift键失灵怎么办 比熊鼻子粉了怎么办 比熊的皮肤变黑怎么办 猫吃了死老鼠怎么办 魅族手机锁定了怎么办 魅蓝2手机锁住了怎么办 罗技鼠标坏了怎么办