Android 高级控件-RecyclerView

  RecylerView是Android5.0推出的新控件,相较于ListView和GridView,RecylerView有以下几个特点:

1.不关心Item是否显示在正确的位置上,如何显示。利用LayoutManager来控制RecylerView的显示风格
2.不关心Item之间如何分割。 利用ItemDecoration来设置分割线的效果
3.不关心Item增加与删除的动画效果。利用ItemAnimator来控制动画效果
4.仅仅关注如何回收和复用View。

  在RecyLerView中,强制我们使用ViewHolder的模式,这一点要记得。

1.建立布局文件

(1). 建立每个Item的布局



    

(2). 建立主布局



    

2.实现RecylerView的Adapter

package com.example.android_recylerview;

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.List;

/**
 * Created by 前世诀别的一纸书 on 2017/2/23.
 */

public class MyAdapter extends RecyclerView.Adapter {

    private LayoutInflater mInflater = null;
    private List mDatas = null;
    public MyAdapter(Context context, List datas)
    {
        this.mDatas = datas;
        this.mInflater = LayoutInflater.from(context);
    }
    //创建ViewHolder
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.item_layout, parent, false);
        MyViewHolder viewHolder = new MyViewHolder(view);
        return viewHolder;
    }
    //绑定ViewHolder
    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        holder.mTextView.setText(mDatas.get(position));
    }

    @Override
    public int getItemCount() {
        return mDatas.size();
    }
    class MyViewHolder extends RecyclerView.ViewHolder
    {
        public TextView mTextView = null;
        public MyViewHolder(View itemView) {
            super(itemView);
            mTextView = (TextView) itemView.findViewById(R.id.id_textView);
        }
    }
}

4.在MainActivity中使用RecylerView

//设置布局管理
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL, false); // LinearLayout的布局
        GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 4);  // GridView的布局
        StaggeredGridLayoutManager gridLayoutManager1 = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.HORIZONTAL); // 水平的GridView的布局
        mRecylerView.setLayoutManager(gridLayoutManager1);
        //设置分割线
        //mRecylerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));

5.将GridView变为瀑布流

  以下的代码是在eclipse上实现的,我没在Android studio 上实现成功。。。。



    


   同时Myadapter上里面定义一个List类型的数组,用来存储每个Item的高度,而初始化List数组是利用随机数来初始化的.

for(int i = 0; i < mDatas.size(); i++)
 {
    mHeights.add((int) (100 + Math.random() * 400));
}

  初始化成功后,在onBindVIewHolder中使用

//绑定ViewHolder
    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        ViewGroup.LayoutParams layoutParams = holder.mTextView.getLayoutParams();
        layoutParams.height = mHeights.get(position);
        holder.mTextView.setLayoutParams(layoutParams);
        holder.mTextView.setText(mDatas.get(position));

    }

6.增加和删除Item的功能

  在menu文件下,增加几个Item,将这几个Item加在ActionBar上面。


    

7.为RecylerView添加动画

  这个动画是系统给我们的,是系统实现的。

mRecylerView.setItemAnimator(new DefaultItemAnimator());

8.为Item增加点击事件

  由于RecylerView没有为内部的Item实现点击事件,因此我们需要自己来完成点击事件的监听
  思路:在Adapter内部定义一个接口,供外部来使用,同时在Adapter内部为每一个Item实现点击事件,事件调用接口里面的方法。

public interface OnItemClickListener
    {
        void OnItemClick(View view, int pos);
        void OnItemLongClick(View view, int pos);
    }
    private OnItemClickListener mItemOnClickListener = null;
    public void setOnItemClickListener(OnItemClickListener itemOnClickener)
    {
        this.mItemOnClickListener = itemOnClickener;
    }

  在onBindViewHolder方法里面定义每一个接口的监听事件

@Override
    public void onBindViewHolder(final MyViewHolder arg0, final int arg1) {
        arg0.mTextView.setText(mDatas.get(arg1));
        if(mItemOnClickListener != null)
        {
            arg0.itemView.setOnClickListener(new OnClickListener(){
                @Override
                public void onClick(View v) {
                    int oldPosition = arg0.getPosition();
                    mItemOnClickListener.OnItemClick(arg0.itemView, oldPosition);
                }
            });
            arg0.itemView.setOnLongClickListener(new OnLongClickListener() {
                
                @Override
                public boolean onLongClick(View v) {
                    int oldPosition = arg0.getPosition();
                    mItemOnClickListener.OnItemLongClick(arg0.itemView, arg1);
                    return false;
                }
            });
        }
    }

你可能感兴趣的:(Android 高级控件-RecyclerView)