RecyclerView基本用法

  RecyclerView已经出来很久了,不过项目里一直用的是ListView和GridView,主要是因为RecyclerView还是在V7包里的,总赶脚应该还有些缺陷,一直也没有去了解,后来发现市场上很多项目里已经用上了这个新的控件,而且感觉视觉效果和体验比之前一直用的ListView更好,就抽时间看了下RecyclerView的相关内容。
先介绍下基本用法:
首先要导入support包:

compile 'com.android.support:appcompat-v7:23.1.1'

布局:

<android.support.v7.widget.RecyclerView
     android:id="@+id/recycler_view_list"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     />

在代码里使用:

import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import java.util.ArrayList;
/**
 * Created by Aislli on 2016/3/3.
 */
public class SimpleRecyclerViewActivity extends Activity {
    private RecyclerView recyclerView;
    private LinearLayoutManager linearLayoutManager;
    private ArrayList<String> list;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.content_simple);
        initView();
        initData();
    }
    private void initView() {
        recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
    }
    private void initData() {
        list = new ArrayList<>();
        for (int i = 0; i < 60; i++) {
            list.add("item:" + i);
        }
        SimpleRecyclerViewAdapter simpleRecyclerViewAdapter = new SimpleRecyclerViewAdapter(this, list);
        linearLayoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(linearLayoutManager);//设置布局管理器
        recyclerView.setAdapter(simpleRecyclerViewAdapter);//设置adapter
    }
}

adapter代码:

package com.lcp.arecyclerview;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.Arrays;
import java.util.List;
/**
 * Created by Aislli on 2015/12/25.
 */
public class SimpleRecyclerViewAdapter extends RecyclerView.Adapter<SimpleRecyclerViewAdapter.MyViewHolder> {
    private Context mContext;
    private List<String> mList;
    public SimpleRecyclerViewAdapter(Context mContext, List<String> list) {
        this.mContext = mContext;
        this.mList = list;
    }
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        MyViewHolder holder = new MyViewHolder(LayoutInflater.from(
                mContext).inflate(R.layout.item_f3_recycler, parent,
                false));
        return holder;
    }
    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        holder.idNum.setText(mList.get(position));
    }
    @Override
    public int getItemCount() {
        return mList.size();
    }
    public void add(String string) {
        insert(string, mList.size());
    }
    public void insert(String string, int position) {
        mList.add(position, string);
        notifyItemInserted(position);
    }
    public void remove(int position) {
        mList.remove(position);
        notifyItemRemoved(position);
    }
    public void clear() {
        int size = mList.size();
        mList.clear();
        notifyItemRangeRemoved(0, size);
    }
    public void addAll(String[] strings) {
        int startIndex = mList.size();
        mList.addAll(startIndex, Arrays.asList(strings));
        notifyItemRangeInserted(startIndex, strings.length);
    }
    class MyViewHolder extends RecyclerView.ViewHolder {
        TextView idNum;
        public MyViewHolder(View view) {
            super(view);
            idNum = (TextView) view.findViewById(R.id.id_num);
        }
    }
}

adapter里的方法和ListView的不一样了,不再通过getView方法去绑定布局和数据了,而是onCreateViewHolder绑定布局,onBindViewHolder方法绑定数据,另一个需要注意的是更新数据时需要使用指定的notifyItemInserted(int position)和notifyItemRemoved(int position)等方法,因为 在RecyclerView里删除和增加item时可以添加动画效果,通过notifyDataSetChanged()方法更新UI是没有动画效果的;上面代码里的add()、insert()、remove()等方法是直接写到当前adapter里了,实际项目里是抽取到BaseAdapter里的,不需要每个adapter里都写一遍这些方法。
代码运行效果:
这里写图片描述
从上面的最最最简单使用RecyclerView的代码中基本能看出来,架构的高度解耦特点,通过布局管理器RecyclerView.LayoutManager管理布局,可以轻松实现ListView和GridView效果,官方提供了3个RecyclerView.LayoutManager的实现类:
1. LinearLayoutManager:线性布局管理器,可以横向和纵向布局,默认纵向(ListView效果)
2.GridLayoutManager:网格式布局管理器,GridView效果
3.StaggeredGridLayoutManager:瀑布流

上图是linearLayoutManager 布局效果,想从上图效果修改为GridView效果,只需要修改下布局管理器:

private void initData() {
        list = new ArrayList<>();
        for (int i = 0; i < 60; i++) {
            list.add("item:" + i);
        }
        SimpleRecyclerViewAdapter simpleRecyclerViewAdapter = new SimpleRecyclerViewAdapter(this, list);
//        linearLayoutManager = new LinearLayoutManager(this);
        linearLayoutManager = new GridLayoutManager(this,3);//3列的GridView
        recyclerView.setLayoutManager(linearLayoutManager);
        recyclerView.setAdapter(simpleRecyclerViewAdapter);
    }

其他代码不变,效果如下图:
这里写图片描述

还有一种官方提供的布局管理器StaggeredGridLayoutManager可以指定GridView是横向还是纵向,可很轻松的实现瀑布流,例如在adapter里加段模拟瀑布流的代码,设置下item的随机高度:

@Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
        holder.idNum.setText(mList.get(position));
        ViewGroup.LayoutParams layoutParams = holder.idNum.getLayoutParams();
        layoutParams.height = (int) (100 + Math.random() * 400);
        holder.idNum.setLayoutParams(layoutParams);
    }

调用代码修改为:

private void initData() {
        list = new ArrayList<>();
        for (int i = 0; i < 60; i++) {
            list.add("item:" + i);
        }
        linearLayoutManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);//3列竖着排列的布局
        mReListAdapter = new RcGridFallAdapter(this, list);
        mRecyclerView.setLayoutManager(linearLayoutManager);
        mRecyclerView.setAdapter(mReListAdapter);        
        setListener();
    }

效果如下图:
这里写图片描述

OK,上面就是最简单使用RecyclerView的例子,代码很简单,和下一篇一起上传,下一篇实现RecyclerView的下拉刷新和上拉加载更多。

扫描二维码关注公众号,回复: 404724 查看本文章

猜你喜欢

转载自blog.csdn.net/aislli/article/details/50802092