Android中的RecycleView

来源:互联网 发布:python抓取json数据 编辑:程序博客网 时间:2024/06/10 20:25

RecycleView原理图
这里写图片描述

RecycleView使用
(1)gradle

compile 'com.android.support:recyclerview-v7:24.1.0'

(2)XML

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

(3)代码

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view);recyclerView.setAdapter(adapter);recyclerView.setLayoutManager(layoutManager);

(4)RecycleView.Adapter

public static abstract class Adapter<VH extends ViewHolder> {//返回itemViewpublic abstract VH onCreateViewHolder(ViewGroup parent, int viewType);//绑定数据public abstract void onBindViewHolder(VH holder, int position);

(5)ItemAnimator

SimpleItemAnimator中的方法

public void runPendingAnimations()public void endAnimation(ViewHolder item)public void endAnimations()public boolean isRunning() 

itemAnimator中的回调方法

实例代码

public class FadeInItemAnimator extends SimpleItemAnimator {    private List<ViewHolder> pendingAddViewHolderList = new ArrayList<>();    private List<ViewHolder> addAnimationViewHolderList = new ArrayList<>();    //动画移动    @Override    public boolean animateRemove(ViewHolder holder) {        return false;    }    //动画添加    @Override    public boolean animateAdd(ViewHolder holder) {        View view = holder.itemView;        ViewCompat.setAlpha(view, 0);        pendingAddViewHolderList.add(holder);        return true;    }    //动画移动    @Override    public boolean animateMove(ViewHolder holder, int fromX, int fromY, int toX, int toY) {        return false;    }    //动画改变    @Override    public boolean animateChange(ViewHolder oldHolder, ViewHolder newHolder, int fromLeft, int fromTop, int toLeft, int toTop) {        return false;    }    //运行动画时    @Override    public void runPendingAnimations() {        for (int i = 0; i < pendingAddViewHolderList.size(); i++) {            final ViewHolder viewHolder = pendingAddViewHolderList.get(i);            addAnimationViewHolderList.add(viewHolder);            View view = viewHolder.itemView;            final ViewPropertyAnimatorCompat animator = ViewCompat.animate(view);            animator.alpha(1).setDuration(1000).setListener(new ViewPropertyAnimatorListener() {                @Override                public void onAnimationStart(View view) {                }                @Override                public void onAnimationEnd(View view) {                    animator.setListener(null);                    ViewCompat.setAlpha(view, 1);                    dispatchAddFinished(viewHolder);                    addAnimationViewHolderList.remove(viewHolder);                    if (!isRunning()) {                        dispatchAnimationsFinished();                    }                }                @Override                public void onAnimationCancel(View view) {                }            }).start();        }        pendingAddViewHolderList.clear();    }    //单个Item动画结束时    @Override    public void endAnimation(ViewHolder item) {        View view = item.itemView;        ViewCompat.animate(view).cancel();        for (int i = 0; i < pendingAddViewHolderList.size(); i++) {            ViewHolder viewHolder = pendingAddViewHolderList.get(i);            if (viewHolder == item) {                pendingAddViewHolderList.remove(i);                ViewCompat.setAlpha(view, 1);                dispatchAddFinished(item);            }        }        if (!isRunning()) {            dispatchAnimationsFinished();        }    }    //全部动画结束时    @Override    public void endAnimations() {        for (int i = 0; i < pendingAddViewHolderList.size(); i++) {            ViewHolder viewHolder = pendingAddViewHolderList.get(i);            View view = viewHolder.itemView;            pendingAddViewHolderList.remove(i);            ViewCompat.setAlpha(view, 1);            dispatchAddFinished(viewHolder);        }        for (int i = 0; i < addAnimationViewHolderList.size(); i++) {            ViewHolder viewHolder = addAnimationViewHolderList.get(i);            View view = viewHolder.itemView;            ViewCompat.animate(view).cancel();        }    }    @Override    public boolean isRunning() {        return !pendingAddViewHolderList.isEmpty()                || !addAnimationViewHolderList.isEmpty();    }}

(6)ItemDecoration

        recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() {            private Drawable divider = getResources().getDrawable(R.drawable.decoration_drawable);            //在绘制内容下方,被item挡住            @Override            public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {                super.onDraw(c, parent, state);//                final int childCount = parent.getChildCount();//                for (int i = 0; i < childCount; i++) {//                    View child = parent.getChildAt(i);//                    int top = child.getBottom();//                    final int bottom = top + 10;//                    int left = child.getLeft();//                    int right = child.getRight();//                    divider.setBounds(left, top, right, bottom);//                    divider.draw(c);//                }            }            //在绘制内容上方,挡住item            @Override            public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {                super.onDrawOver(c, parent, state);                final int childCount = parent.getChildCount();                for (int i = 0; i < childCount; i++) {                    View child = parent.getChildAt(i);                    int top = child.getBottom();                    int bottom = top + 300;                    int left = child.getLeft();                    int right = child.getRight();                    divider.setBounds(left, top, right, bottom);                    divider.draw(c);                }            }            //四周增加边距            @Override            public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {                super.getItemOffsets(outRect, view, parent, state);            }        });

(7)缺陷
没有Divider
没有HeaderView/FooterView
没有emptyView
没有onitemClicker

recyclerView.addOnItemTouchListener(new RecyclerView.OnItemTouchListener() {            @Override            public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {                return false;            }            @Override            public void onTouchEvent(RecyclerView rv, MotionEvent e) {            }            @Override            public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {            }        });
0 0
原创粉丝点击