美文网首页
2019重新Android回顾 布局之RecyclerView篇

2019重新Android回顾 布局之RecyclerView篇

作者: 肖雨San | 来源:发表于2019-01-25 02:04 被阅读14次

    RecyclerView用于大数据集合或者数据经常变化的滚动List元素场景(相对于Listview用在数据不会变化),RecyclerView是一个更优化,更灵活的ListView

    RecyclerView需要使用一个layout manager来管理填充它的视图们。(LinearLayoutManager 或者 GridLayoutManagerStaggeredGridLayoutManager或自定义RecyclerView.LayoutManager

    RecyclerView的每一个Item都是一个view holder (RecyclerView.ViewHolder的实例对象),当Item被用户滑动出屏幕时,RecyclerView收回他们,当重新显示时,RecyclerView再重新绑定数据。

    view holder 需要一个Adapter进行管理(使用RecyclerView.Adapter),Adapter负责创建需要的视图,Adapter还负责绑定数据到view holderonBindViewHolder()

    RecyclerView已经优化的地方:

    1.当RecyclerView第一次展示的时候,RecyclerView会创建并绑定所有显示的view holder以及部分记下来会被显示的view holder以方便操作

    2.当用户滑动List时,RecyclerView会创建需要显示的view holder并且在滑动出界面时,保存他们,以便当用户切换滑动方向时reuse。当用户朝一个方向持续滑动时,离开屏幕最远的view holder将被用来绑定新的数据,而不需要再重新创建view holder节省资源开支。

    3.当Item数据发生变化时,只需要调用RecyclerView.Adapter.notify…()。Adapter的代码仅绑定变化的Item

    使用步骤参考:

    1.添加依赖包(com.android.support:recyclerview-v7:x.y.z)

    2.添加RecyclerView到布局文件

    3.代码中使用

    // 获取RecyclerView实例

    mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);

    // 创建  LayoutManager 管理

    mLayoutManager = new LinearLayoutManager(this);

    mRecyclerView.setLayoutManager(mLayoutManager);         

    // 指定Adapter      

    mAdapter = new MyAdapter(myDataset);

    mRecyclerView.setAdapter(mAdapter);

    自定义Adapter

    public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {    

        private String[] mDataset;    

        // 每一个Item绑定data到View

        // 复杂的数据,一个ViewHolder可能需要多个View,所以ViewHolder要有所有操作View的权限  

        public static class MyViewHolder extends RecyclerView.ViewHolder {        

            public TextView mTextView;        

            public MyViewHolder(TextView v) {            

                super(v);            

                mTextView = v;        

            }    

        }       

        public MyAdapter(String[] myDataset) {        

            mDataset = myDataset;    

        }    

        //  创建ViewHolder的视图们,layout manager调用

        @Override    

        public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        

            // create a new view        

            TextView v = (TextView) LayoutInflater.from(parent.getContext()).inflate(R.layout.my_text_view, parent, false);        

            ...        

            MyViewHolder vh = new MyViewHolder(v);        

            return vh;    

        }    

        // 替换ViewHolder的视图们的数据 ,layout manager调用

        @Override    

        public void onBindViewHolder(MyViewHolder holder, int position) {        

            holder.mTextView.setText(mDataset[position]);     

        }    

        // 数据集数量,layout manager调用

        @Override    

        public int getItemCount() {        

            return mDataset.length;    

        }

    }

    添加自定义动画

    RecyclerView默认使用DefaultItemAnimator,自定义extends RecyclerView.ItemAnimator

    添加选择支持

    recyclerview-selection可以扩展支持RecyclerView列表Item选择

    操作步骤:

    1.决定选择Key类型,创建ItemKeyProvider

    2.继承ItemDetailsLookup,用于获取RecyclerView的Items权限添加MotionEvent

    3.反射更新用户选择的或者没有选择的RecyclerView的Views(recyclerview-selection并没有为Select item提供decoration,需要自己在onBindViewHolder()设置)

    3.1.onBindViewHolder()中调用ViewHolder的setActivated(),true被选择,false未被选择

    3.2.根据activated的状态设置自己需要的color state list resource 

    4.使用ActionMode为用户提供选择操作,注册一个SelectionTracker.SelectionObserver用来监听选择项发生变化,当Item第一次被选中,启动ActionMode告知用户被选中操作,并且还可以提供选中内容的特别操作,如删除等。

    5.在选择操作完成后,可以注册适当的监听进行下一步操作。

    6.组合以上内容到SelectionTracker.Builder

    7.为了保存选择状态,需要在Activity生命周期的onSaveInstanceState() 和 onRestoreInstanceState() 中调用SelectionTrackeronSaveInstanceState() 和 onRestoreInstanceState() 。并且要为每一个SelectionTracker指定一个唯一ID。

    RecyclerView参考demo-sunflower(kotlin代码)

    相关文章

      网友评论

          本文标题:2019重新Android回顾 布局之RecyclerView篇

          本文链接:https://www.haomeiwen.com/subject/utupjqtx.html