美文网首页Android资源整理Android开发Android技术知识
Android控件开发——RecycleView的使用总结(上)

Android控件开发——RecycleView的使用总结(上)

作者: 程序猿男神 | 来源:发表于2017-03-09 20:53 被阅读1517次

    文/程序员男神

    前言

    最近一直都在忙公司的新项目,忙的连自己学习的时间都没了(此处有掌声),又厚着脸皮装逼了一次,回到家都累成狗,还要总结最近学习的技术。这个总结会分为三篇去写,让你从懵懂无知变成情场高手,错错错...,变成职场达人。
    今天本来约小女友出去吃饭,因为是自己生日,谁知今天她临时有事,就在家撸代码给自己过个生日吧!


    aj

    概述

    RecycleView为什么会取代ListView?
    RecylerView是support-v7包中的新组件,是一个强大的滑动组件。
    优势如下:
    1、RecylerView封装了ViewHolder的回收复用,也就是说RecylerView标准化了ViewHolder,编写Adapter面向的是ViewHolder而不再是View了,复用的逻辑被封装了,写起来更加简单。
    2、提供了一种插拔式的体验,高度的解耦,异常的灵活,针对一个Item的显示RecylerView专门抽取出了相应的类,来控制Item的显示,使其的扩展性非常强。
    3、可以控制Item增删的动画,可以通过ItemAnimator这个类进行控制,当然针对增删的动画,RecylerView有其自己默认的实现。

    RecycleView的基本用法

    1、你想要控制其显示的方式,请通过布局管理器LayoutManager
    2、你想要控制Item间的间隔(可绘制),请通过ItemDecoration
    3、你想要控制Item增删的动画,请通过ItemAnimator
    4、你想要控制点击、长按事件,对不起,自己Mark接口回调
    5、你想要控制Item的增删,对不起,也是自己Mark
    相应代码:

     mRecyclerView = (RecyclerView) findViewById(R.id.recycle_view);
    //设置分割线
     mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
     mLayoutManager = new LinearLayoutManager(this);
    //设置布局管理器
     mRecyclerView.setLayoutManager(mLayoutManager);
    //绑定数据
     mAdapter = new RecycleAdapter(list);
    //设置Item增加、移除动画
    mRecyclerView.setItemAnimator(new DefaultItemAnimator());
    //设置Adapter
     mRecyclerView.setAdapter(mAdapter);
    
    //点击、长按回调接口代码
       /**
         * 定义接口回调
         */
        public interface OnItemClickListener {
            void onItemClick(View view, int position);
    
            void onItemLongClick(View view, int position);
        }
    
        private OnItemClickListener mOnItemClickListener;
    
        public void setOnItemClickListener(OnItemClickListener listener) {
            this.mOnItemClickListener = listener;
        }
    
     /**
         * 向指定位置添加元素
         */
        public void addItem(int position, String value) {
            if (position > data.size()) {
                position = data.size();
            }
            if (position < 0) {
                position = 0;
            }
            /**
             * 使用notifyItemInserted/notifyItemRemoved会有动画效果
             * 而使用notifyDataSetChanged()则没有
             */
            data.add(position, value);//在集合中添加这条数据
            notifyItemInserted(position);//通知插入了数据
        }
    
        /**
         * 移除指定位置元素
         */
        public String removeItem(int position) {
            if (position > data.size() - 1) {
                return null;
            }
            String value = data.remove(position);//所以还需要手动在集合中删除一次
            notifyItemRemoved(position);//通知删除了数据,但是没有删除list集合中的数据
            return value;
        }
    

    要想使用,我们需要在gradle中添加依赖:

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

    具体事例代码:

    MainActivity的代码:

    /**
     * desc: Recycle的简单使用
     * author: dj
     * date: 2017/3/2 9:57
     */
    
    public class RecycleActivity extends AppCompatActivity {
    
        private RecyclerView mRecyclerView;
        private RecycleAdapter mAdapter;
        private RecyclerView.LayoutManager mLayoutManager;
        private List<String> list;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_recycle);
    
            initDate();
            initView();
    
        }
    
        private void initDate() {
            list = new ArrayList<String>();
            for (int i = 0; i < 20; i++) {
                list.add("西红柿炒鸡蛋");
            }
        }
    
        private void initView() {
            mRecyclerView = (RecyclerView) findViewById(R.id.recycle_view);
            mRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL));
            mLayoutManager = new LinearLayoutManager(this);
            mRecyclerView.setLayoutManager(mLayoutManager);
            mAdapter = new RecycleAdapter(list);
            mRecyclerView.setAdapter(mAdapter);
            mAdapter.setOnItemClickListener(new RecycleAdapter.OnItemClickListener() {
                @Override
                public void onItemClick(View view, int position) {
                    Toast.makeText(RecycleActivity.this,"onItemClick",Toast.LENGTH_SHORT).show();
                }
    
                @Override
                public void onItemLongClick(View view, int position) {
                    Toast.makeText(RecycleActivity.this,"onItemLongClick",Toast.LENGTH_SHORT).show();
                }
            });
    
        }
    }
    
    

    接下来我们看看我们的Adapter怎么去写?
    代码如下:

    /**
     * desc: RecycleView的Adapter
     * author: dj
     * date: 2017/2/28 15:20
     */
    
    public class RecycleAdapter extends RecyclerView.Adapter<RecycleAdapter.ViewHolder> {
    
        private List<String> date;
    
        //构造器,接受数据集
        public RecycleAdapter(List<String> date) {
            this.date = date;
        }
    
        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false);
            ViewHolder holder = new ViewHolder(view);
            return holder;
        }
    
        @Override
        public void onBindViewHolder(final ViewHolder holder, int position) {
            //将数据填充到具体的view中
            holder.icon.setImageResource(R.drawable.jian);
            holder.title.setText(date.get(position));
            holder.desc.setText(date.get(position));
    
            // 如果设置了回调,则设置点击事件
            if (mOnItemClickListener != null) {
                holder.itemView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        int position1 = holder.getLayoutPosition();
                        mOnItemClickListener.onItemClick(holder.itemView, position1);
                    }
                });
                holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {
                        int position1 = holder.getLayoutPosition();
                        mOnItemClickListener.onItemLongClick(holder.itemView, position1);
                        return false;
                    }
                });
            }
        }
    
        @Override
        public int getItemCount() {
            return date.size();
        }
    
        class ViewHolder extends RecyclerView.ViewHolder {
    
            public ImageView icon;
            public TextView title;
            public TextView desc;
    
            public ViewHolder(View itemView) {
                super(itemView);
                //由于itemView是item的布局文件,我们需要的是里面的textView,因此利用itemView.findViewById获
                //取里面的textView实例,后面通过onBindViewHolder方法能直接填充数据到每一个textView了
                icon = (ImageView) itemView.findViewById(R.id.item_image);
                title = (TextView) itemView.findViewById(R.id.item_title);
                desc = (TextView) itemView.findViewById(R.id.item_desc);
    
            }
        }
    
        /**
         * 定义接口回调
         */
        public interface OnItemClickListener {
            void onItemClick(View view, int position);
    
            void onItemLongClick(View view, int position);
        }
    
        private OnItemClickListener mOnItemClickListener;
    
        public void setOnItemClickListener(OnItemClickListener listener) {
            this.mOnItemClickListener = listener;
        }
    }
    
    

    接下来就是我们简单一下xml文件:
    activity_recycle的代码:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycle_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>
    
    

    item_list的代码:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
    
        <ImageView
            android:id="@+id/item_image"
            android:layout_width="100dp"
            android:layout_height="70dp"
            android:padding="6dp" />
    
        <LinearLayout
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:orientation="vertical">
    
            <TextView
                android:id="@+id/item_title"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textAppearance="@android:style/TextAppearance.Large" />
    
            <TextView
                android:id="@+id/item_desc"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:ellipsize="end"
                android:maxLines="2" />
        </LinearLayout>
    </LinearLayout>
    

    效果图如下:

    RecycleView

    总结

    上面这些就是RecycleView的基本使用,显示一个图片,两行文字的效果。
    参考:http://blog.csdn.net/lmj623565791/article/details/45059587

    相关文章

      网友评论

      本文标题:Android控件开发——RecycleView的使用总结(上)

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