美文网首页
Android5.0-RecyclerView

Android5.0-RecyclerView

作者: jacky123 | 来源:发表于2016-06-27 15:52 被阅读26次

    RecyclerView是谷歌V7包下新增的控件,用来替代ListView的使用,在RecyclerView标准化了ViewHolder类似于ListView中convertView用来做视图缓.


    RecyclerView vs AdapterView

    • item复用方面:RecyclerView内置了RecyclerViewPool、多级缓存、ViewHolder,而AdapterView需要 手动添加ViewHolder且复用功能也没RecyclerView更加完善

    • 样式丰富方面:RecyclerView通过支持水平、垂直和表格列表及其他更复杂形式,而AdapterView只支持具体某一种

    • 效果增强方面:RecyclerView内置了ItemDecoration和ItemAnimator,可以自定义绘制itemView之间的一些特殊UI或item项数据变化时的动画效果,而用AdapterView实现时采取的做法是将这些特殊UI作为itemView的一部分,设置可见不可见决定是否展现,且数据变化时的动画效果没有提供,实现起来比较麻烦.

    • 代码内聚方面:RecyclerView将功能密切相关的类写成内部类,如ViewHolder,Adapter,而AdapterView没有.

    参考 RecyclerView源码分析


    模板Adapter

    public class NormalRecyclerViewAdapter extends RecyclerView.Adapter<NormalRecyclerViewAdapter.NormalTextViewHolder> {
        private final LayoutInflater mLayoutInflater;
        private final Context mContext;
        private String[] mTitles;
    
        public NormalRecyclerViewAdapter(Context context) {
            mTitles = context.getResources().getStringArray(R.array.titles);
            mContext = context;
            mLayoutInflater = LayoutInflater.from(context);
        }
    
        @Override
        public NormalTextViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            return new NormalTextViewHolder(mLayoutInflater.inflate(R.layout.item_text, parent, false));
        }
    
        @Override
        public void onBindViewHolder(NormalTextViewHolder holder, int position) {
            holder.mTextView.setText(mTitles[position]);
        }
    
        @Override
        public int getItemCount() {
            return mTitles == null ? 0 : mTitles.length;
        }
    
        public static class NormalTextViewHolder extends RecyclerView.ViewHolder {
            @InjectView(R.id.text_view)
            TextView mTextView;
    
            NormalTextViewHolder(View view) {
                super(view);
                ButterKnife.inject(this, view);
                view.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Log.d("NormalTextViewHolder", "onClick--> position = " + getPosition());
                    }
                });
            }
        }
    }
    

    实现

    1. 首先要用这个控件,你需要在gradle文件中添加包的引用(配合官方CardView使用)
    compile 'com.android.support:cardview-v7:21.0.3'
    compile 'com.android.support:recyclerview-v7:21.0.3'
    
    1. 在XML文件用使用它
    <android.support.v7.widget.RecyclerView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/recycler_view"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"/>
    
    1. 在Activity中设置它
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));//这里用线性显示 类似于listview
    //  mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));//这里用线性宫格显示 类似于grid view
    //  mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, OrientationHelper.VERTICAL));//这里用线性宫格显示 类似于瀑布流
    mRecyclerView.setAdapter(new NormalRecyclerViewAdapter(this));
    

    完整代码,请戳我的github :jack_recyclerview_demo

    参考资料

    推荐阅读

    相关文章

      网友评论

          本文标题:Android5.0-RecyclerView

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