RecyclerView详解

来源:互联网 发布:华东理工大学知乎事件 编辑:程序博客网 时间:2024/05/20 01:44

不说废话:直接代码


package com.example.recyclerveiwdemo;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.StaggeredGridLayoutManager;import android.view.View;import com.example.recyclerveiwdemo.adapter.MyAdapter;public class MainActivity extends AppCompatActivity {    private RecyclerView recyclerView;    private MyAdapter myAdapter;    private LinearLayoutManager linearLayoutManager;    private GridLayoutManager gridLayoutManager;    private StaggeredGridLayoutManager staggeredGridLayoutManager;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);        //listView的形式展示        linearLayoutManager = new LinearLayoutManager(this);        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);        //gridview的形式展示,可以通过setSpanSizeLookup 来自定义每个item占的列数        gridLayoutManager = new GridLayoutManager(this, 3);        gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {            @Override            public int getSpanSize(int position) {                return 3 - position % 3;            }        });        //瀑布流的形式        staggeredGridLayoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);        recyclerView.setLayoutManager(linearLayoutManager);        myAdapter = new MyAdapter();        recyclerView.setAdapter(myAdapter);        myAdapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {            @Override            public void onItemClick(View v, int position) {                //增加和删除的话 不直接对postion做处理,因为此处的position是没有刷新以前的position                myAdapter.add(position);            }        });        myAdapter.setOnItemLongClickListener(new MyAdapter.OnItemLongClickListener() {            @Override            public void onItemLongClick(View v, int position) {                //remove的操作//                myAdapter.remove(position);                //更新的操作                myAdapter.updata(position,"这是我更新的内容");            }        });        recyclerView.addItemDecoration(new MyDecoration(this,LinearLayoutManager.VERTICAL));    }    public void onClick(View v) {        //切换布局        RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();        if (layoutManager == null) {            return;        }        //if和elseif是有先后顺序的,先判断范围小的,然后再判断范围大的,        //因为GridLayoutManager 是继承 LinearLayoutManager ,所以他本质上也是LinearLayoutManager,        //所以不能先判断是否是LinearLayoutManager (LinearLayoutManager范围大)        if (layoutManager instanceof GridLayoutManager) {            recyclerView.setLayoutManager(linearLayoutManager);        } else if (layoutManager instanceof LinearLayoutManager) {            recyclerView.setLayoutManager(gridLayoutManager);        }    }}
package com.example.recyclerveiwdemo;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.View;/** * Created by hasee on 2017/8/31. */public class MyDecoration extends RecyclerView.ItemDecoration {    private Context mContext;    private Drawable mDivider;    private int mOrientation;    public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;    public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;    //我们通过获取系统属性中的listDivider来添加,在系统中的AppTheme中设置    public static final int[] ATRRS = new int[]{            android.R.attr.listDivider    };    public MyDecoration(Context context, int orientation) {        this.mContext = context;        final TypedArray ta = context.obtainStyledAttributes(ATRRS);        this.mDivider = ta.getDrawable(0);        ta.recycle();        setOrientation(orientation);    }    //设置屏幕的方向    public void setOrientation(int orientation) {        if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {            throw new IllegalArgumentException("invalid orientation");        }        mOrientation = orientation;    }    @Override    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {        if (mOrientation == HORIZONTAL_LIST) {            drawVerticalLine(c, parent, state);        } else {            drawHorizontalLine(c, parent, state);        }    }    //画横线, 这里的parent其实是显示在屏幕显示的这部分    public void drawHorizontalLine(Canvas c, RecyclerView parent, RecyclerView.State state) {        int left = parent.getPaddingLeft();        int right = parent.getWidth() - parent.getPaddingRight();        final int childCount = parent.getChildCount();        for (int i = 0; i < childCount; i++) {            final View child = parent.getChildAt(i);            //获得child的布局信息            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();            final int top = child.getBottom() + params.bottomMargin;            final int bottom = top + mDivider.getIntrinsicHeight();            mDivider.setBounds(left+params.leftMargin, top, right-params.leftMargin, bottom);            mDivider.draw(c);            //Log.d("wnw", left + " " + top + " "+right+"   "+bottom+" "+i);        }    }    //画竖线    public void drawVerticalLine(Canvas c, RecyclerView parent, RecyclerView.State state) {        int top = parent.getPaddingTop();        int bottom = parent.getHeight() - parent.getPaddingBottom();        final int childCount = parent.getChildCount();        for (int i = 0; i < childCount; i++) {            final View child = parent.getChildAt(i);            //获得child的布局信息            final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child.getLayoutParams();            final int left = child.getRight() + params.rightMargin;            final int right = left + mDivider.getIntrinsicWidth();            mDivider.setBounds(left, top+params.topMargin, right, bottom-params.topMargin);            mDivider.draw(c);        }    }    //由于Divider也有长宽高,每一个Item需要向下或者向右偏移    @Override    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {        if (mOrientation == HORIZONTAL_LIST) {            //画横线,就是往下偏移一个分割线的高度            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());        } else {            //画竖线,就是往右偏移一个分割线的宽度            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);        }    }}


package com.example.recyclerveiwdemo.adapter;import android.support.v7.widget.RecyclerView;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.TextView;import com.example.recyclerveiwdemo.R;import java.util.ArrayList;/** * Created by hasee on 2017/8/30. */public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {    ArrayList<String> list;    public MyAdapter() {        list = new ArrayList<>();        for (int i = 0; i < 30; i++) {            list.add("条目 " + i);        }    }    //创建布局和viewHolder    @Override    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        //inflate的时候,需要传入parent和attachToRoot==false; 使用传入三个参数的方法        View recyclerViewItem = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_view_item, parent, false);        return new MyViewHolder(recyclerViewItem);    }    //增加的方法    public void add(int position) {        //改变数据        list.add(position + 1, "这是新加的");        //调用它带的方法去刷新        notifyItemRangeChanged(position + 1, getItemCount());    }    public void remove(int position) {        list.remove(position);        notifyItemRangeRemoved(position, getItemCount());    }    public void updata(int position, String content) {        list.remove(position);        list.add(position, content);        notifyItemChanged(position);    }    //单击事件的接口    public interface OnItemClickListener {        void onItemClick(View v, int position);    }    //长按事件的接口    public interface OnItemLongClickListener {        void onItemLongClick(View v, int position);    }    private OnItemClickListener mItemClickListener;    private OnItemLongClickListener mItemLongClickListener;    //设置单击事件的接口    public void setOnItemClickListener(OnItemClickListener itemClickListener) {        mItemClickListener = itemClickListener;    }    //设置长按事件的接口    public void setOnItemLongClickListener(OnItemLongClickListener itemLongClickListener) {        mItemLongClickListener = itemLongClickListener;    }    //绑定数据    @Override    public void onBindViewHolder(MyViewHolder holder, final int position) {        holder.title.setText(list.get(position));        //整个item条目的点击//        holder.itemView.setOnClickListener(new View.OnClickListener() {//            @Override//            public void onClick(View v) {//                //// TODO: 2017/8/31 暴露一个单击回调接口//                if (mItemClickListener != null) {//                    mItemClickListener.onItemClick(v, position);//                }//            }//        });        holder.icon.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //// TODO: 2017/8/31 暴露一个单击回调接口                if (mItemClickListener != null) {                    mItemClickListener.onItemClick(v, position);                }            }        });        holder.icon.setOnLongClickListener(new View.OnLongClickListener() {            @Override            public boolean onLongClick(View v) {                if (mItemLongClickListener != null) {                    mItemLongClickListener.onItemLongClick(v, position);                }                // true 消费这个长按事件                return true;            }        });    }    @Override    public int getItemCount() {        return list.size();    }    public class MyViewHolder extends RecyclerView.ViewHolder {        //把整个view放到viewHolder中        View itemView;        TextView title;        ImageView icon;        //findviewById 给控件绑定id        public MyViewHolder(View itemView) {            super(itemView);            this.itemView = itemView;            title = (TextView) itemView.findViewById(R.id.title);            icon = (ImageView) itemView.findViewById(R.id.icon);        }    }}


原创粉丝点击