【UI设计】4、RecycleView的使用

来源:互联网 发布:wap页面纯文字游戏源码 编辑:程序博客网 时间:2024/06/06 05:33

github传送门:https://github.com/lxcgithub/UIdesinge
包名:b_recyclerview

特点:

1.谷歌在高级版本提出一个新的替代ListView、GridView的控件。
2.高度解耦。
3.自带了性能优化。ViewHolder。
软件:低耦合高内聚。

(1)RecyclerView没有条目点击事件,需要自己写。

为了更高的扩展性,google并没有给我们封装点击事件,我们自己item布局自己设置点击事件(比如只有点击item中某个控件时才有效。)

(2)RecyclerView需要手动设置LayoutManager使使用时具有更高的扩展性。

为了更好的实现布局的多样化,实现GridView、ListView和瀑布流样式的切换,布局和视图解耦。

(3)RecyclerView可以给Item添加动画效果

(4)RecyclerView没有分割线,需要自己绘制

RecyclerView.ItemDecoration    1)线性的分割线    2)网格的分割线1).可以通过修改Theme.Appcompa主题样式里面的android:listSelector或者 android:listDivider属性    达到改变间隔线的大小和颜色哦!(自己尝试下)<style name="AppTheme" parent="AppBaseTheme"><item name="android:listDivider">@drawable/item_divider</item></style>2).写一个条目装饰类,继承    class MyItemDecoration extends RecyclerView.ItemDecoration{    }    绘制分发。绘制recyclerView的时候会分发Canvas到ItemDecoration里面。

(5)添加头部和底部:

ListView.addHeadView();ListView.addFooterView();RecyclerView没有这样的方法,需要自己解决所以我们通过看ListView的源码学习如何解决这个问题!!ListView.addHeaderView(){     if (mAdapter != null) {            if (!(mAdapter instanceof HeaderViewListAdapter)) {                mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, mAdapter);            }};ListView.setAdapter(){    if (mHeaderViewInfos.size() > 0|| mFooterViewInfos.size() > 0) {            mAdapter = new HeaderViewListAdapter(mHeaderViewInfos, mFooterViewInfos, adapter);        } else {            mAdapter = adapter;        }}ListView.setAdapter(new SimpleAdapter(xxx))使用了中间代理模式解决的。模仿!!

代码:

1、布局管理器跟Item动画使用

        recylerview = findViewById(R.id.recylerview);        // 自定义添加点击事件的adapter:        adapter = new MyRecyclerAdapter(list);//      adapter = new MyStaggedRecyclerAdapter(list);        //LayoutManager布局摆放管理器(线性摆放、瀑布流)        recylerview.setLayoutManager(new LinearLayoutManager(this));//默认垂直        //reverseLayout:数据倒置,从右边开始滑动//      recylerview.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true));//      recylerview.setLayoutManager(new GridLayoutManager(this, 3));        //瀑布流效果//      recylerview.setLayoutManager(new StaggeredGridLayoutManager(3, LinearLayoutManager.VERTICAL));        recylerview.setAdapter(adapter);        // 添加动画        recylerview.setItemAnimator(new DefaultItemAnimator());

2、添加监听: 通过回调函数添加监听

// MyRecyclerAdapter:@Override    public void onBindViewHolder(MyViewHolder holder, final int position) {        //绑定数据        holder.tv.setText(list.get(position));        if(mOnItemClickListener!=null){            holder.itemView.setOnClickListener(new OnClickListener() {                @Override                public void onClick(View v) {                    mOnItemClickListener.onItemClick(v, position);                }            });        }    }    public interface OnItemClickListener{        void onItemClick(View view, int position);    }    public void setOnItemClickListener(OnItemClickListener listener){        this.mOnItemClickListener = listener;    }// MainActivity:adapter.setOnItemClickListener(new MyRecyclerAdapter.OnItemClickListener() {            @Override            public void onItemClick(View view, int position) {                Toast.makeText(MainActivity.this, "点我干嘛"+position, Toast.LENGTH_SHORT).show();            }        });

3、插入和删除单条数据:

    // 插入数据    public void addData(int position){        list.add(position,"additem"+position);        //提示刷新--会影响效率//      notifyDataSetChanged();        notifyItemInserted(position);    }    // 删除数据    public void removeData(int position){        list.remove(position);        notifyItemRemoved(position);    }

4、添加分割线:

public class LinearLayoutColorDivider extends RecyclerView.ItemDecoration {    private final Drawable mDivider;    private final int mSize;    private final int mOrientation;    public LinearLayoutColorDivider(Resources resources, @ColorRes int color, @DimenRes int size, int orientation) {        mDivider = new ColorDrawable(resources.getColor(color));        mSize = resources.getDimensionPixelSize(size);        mOrientation = orientation;    }    @Override    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {        int left;        int right;        int top;        int bottom;        if (mOrientation == LinearLayoutManager.HORIZONTAL) {            top = parent.getPaddingTop();            bottom = parent.getHeight() - parent.getPaddingBottom();            final int childCount = parent.getChildCount();            for (int i = 0; i < childCount - 1; i++) {                final View child = parent.getChildAt(i);                final RecyclerView.LayoutParams params =                        (RecyclerView.LayoutParams) child.getLayoutParams();                left = child.getRight() + params.rightMargin;                right = left + mSize;                mDivider.setBounds(left, top, right, bottom);                mDivider.draw(c);            }        } else {            left = parent.getPaddingLeft();            right = parent.getWidth() - parent.getPaddingRight();            final int childCount = parent.getChildCount();            for (int i = 0; i < childCount - 1; i++) {                final View child = parent.getChildAt(i);                final RecyclerView.LayoutParams params =                        (RecyclerView.LayoutParams) child.getLayoutParams();                top = child.getBottom() + params.bottomMargin;                bottom = top + mSize;                mDivider.setBounds(left, top, right, bottom);                mDivider.draw(c);            }        }    }    @Override    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {        if (mOrientation == LinearLayoutManager.HORIZONTAL) {            outRect.set(0, 0, mSize, 0);        } else {            outRect.set(0, 0, 0, mSize);        }    }}

5、添加头布局、底部局:
详见源码

原创粉丝点击