Android RecycleView

01.RecycleView的结构

  • 关于RecyclerView,大家都已经很熟悉了,用途十分广泛,大概结构如下所示
    • RecyclerView.Adapter - 处理数据集合并负责绑定视图
    • ViewHolder - 持有所有的用于绑定数据或者需要操作的View
    • LayoutManager - 负责摆放视图等相关操作
    • ItemDecoration - 负责绘制Item附近的分割线
    • ItemAnimator - 为Item的一般操作添加动画效果,如,增删条目等
  • 如图所示,直观展示结构
    • image

02.RecyclerView简单用法

  • 针对上面几个属性,最简单用法如下所示

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    //设置layoutManager
    recyclerView.setLayoutManager(layoutManager);
    final RecycleViewItemLine line = new RecycleViewItemLine(this, LinearLayout.HORIZONTAL,1,this.getResources().getColor(R.color.colorAccent));
    //设置添加分割线
    recyclerView.addItemDecoration(line);
    adapter = new MultipleItemAdapter(this);
    //设置adapter
    recyclerView.setAdapter(adapter);
    //添加数据并且刷新adapter
    adapter.addAll(list);
    adapter.notifyDataSetChanged();


    //adapter
    //onCreateViewHolder(ViewGroup parent, int viewType)这里的第二个参数就是View的类型,可以根据这个类型判断去创建不同item的ViewHolder
    public class MultipleItemAdapter extends RecyclerView.Adapter<recyclerview.viewholder> {
    public static enum ITEM_TYPE {
    ITEM_TYPE_IMAGE,
    ITEM_TYPE_TEXT
    }

    private final LayoutInflater mLayoutInflater;
    private final Context mContext;
    private ArrayList<String> mTitles;

    public MultipleItemAdapter(Context context) {
    mContext = context;
    mLayoutInflater = LayoutInflater.from(context);
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == ITEM_TYPE.ITEM_TYPE_IMAGE.ordinal()) {
    return new ImageViewHolder(mLayoutInflater.inflate(R.layout.item_image, parent, false));
    } else {
    return new TextViewHolder(mLayoutInflater.inflate(R.layout.item_text, parent, false));
    }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    if (holder instanceof TextViewHolder) {
    ((TextViewHolder) holder).mTextView.setText(mTitles[position]);
    } else if (holder instanceof ImageViewHolder) {
    ((ImageViewHolder) holder).mTextView.setText(mTitles[position]);
    }
    }

    @Override
    public int getItemViewType(int position) {
    return position % 2 == 0 ? ITEM_TYPE.ITEM_TYPE_IMAGE.ordinal() : ITEM_TYPE.ITEM_TYPE_TEXT.ordinal();
    }

    @Override
    public int getItemCount() {
    return mTitles == null ? 0 : mTitles.length;
    }

    public void addAll(ArrayList<String> list){
    if(mTitles!=null){
    mTitles.clear();
    }else {
    mTitles = new ArrayList<>();
    }
    mTitles.addAll(list);
    }

    public static class TextViewHolder extends RecyclerView.ViewHolder {
    @InjectView(R.id.text_view)
    TextView mTextView;
    TextViewHolder(View view) {
    super(view);
    ButterKnife.inject(this, view);
    }
    }

    public static class ImageViewHolder extends RecyclerView.ViewHolder {
    @InjectView(R.id.text_view)
    TextView mTextView;
    @InjectView(R.id.image_view)
    ImageView mImageView;
    ImageViewHolder(View view) {
    super(view);
    ButterKnife.inject(this, view);
    }
    }
    }