zoukankan      html  css  js  c++  java
  • RecyclerView学习笔记

    主要方法:
    setLayoutManager:设置显示方式,有LinearLayoutManager(像ListView一样的纵向列表布局),有GridLayoutManager(网格布局),有StaggeredLayoutManager(瀑布流)
    setItemAnimator:设置Item的增加删除动画,系统有提供默认的DefaultItemAnimator()
    addItemDecoration:添加分割线。可自定义分割线类型。
    使用步骤:
    跟ListView类似的:画Item布局,添加RecycleView控件,复写Adapter。不同的是复写RecycleView.Adapter要复写ViewHolder的一些方法,RecyclerView要求必须使用ViewHolder。<ViewHolder的主要的作用,实际上是通过成员变量存储对应的convertView中需要操作的子View,避免每次findViewById,从而提升运行的效率。>
    比如:在Adapter中新建内部类:MyViewHolder extends ViewHolder
    在该类的构造函数中findViewByid来找到item布局中的控件,如:
    class MyViewHolder extends RecyclerView.ViewHolder{
    public MyViewHolder(View view){
      super(view);
      tv = (TextView) view.findViewById(R.id.id_num);
         }
    }

    复写onCreateViewHolder(),在这里来加载Item布局

    @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            MyViewHolder viewHolder = new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.item_layout,parent,false));
            return viewHolder;
        }

    复写onBindViewHolder(),在这里为View填充数据,以及为Item添加点击事件等

    @Override
    public void onBindViewHolder(HomeAdapter.MyViewHolder holder, int position) {
      holder.tv.setText(mData.get(position));
    }

    Adapter基本写好,还可以加入一些addItem或者removeItem的方法。

    接下来就是如何使用了:
    一些常规代码,如:声明并find到RecyclerView,声明adapter,设置LayoutManager
    // mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    // mRecyclerView.setLayoutManager(new GridLayoutManager(this,4));
    //        mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));

    设置(添加、删除)动画

    mRecyclerView.setItemAnimator(new DefaultItemAnimator());

    设置适配器,Ok了

    要添加分割线的话可以参考大神文章http://blog.csdn.net/lmj623565791/article/details/45059587,这个可以用,但是个人觉得这样还是太麻烦了,还不如直接在xml上margin做文章来设置空隙。

    设置点击事件

    添加接口:

    public interface OnItemClickLitener{
            void onItemClick(View view, int position);
            void onItemLongClick(View view , int position);
    }

    添加设置点击事件的方法:

    private OnItemClickLitener mOnItemClickLitener;
    
        public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener)
        {
            this.mOnItemClickLitener = mOnItemClickLitener;
        }
    @Override
    public void onBindViewHolder(final MyViewHolder holder, int position) {
                holder.textView.setText(mDatas.get(position).getTitle());
    
                if (mOnItemClickListener != null){
                    holder.itemView.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            int pos = holder.getLayoutPosition();
                            mOnItemClickListener.onItemClick(view , pos);
                        }
                    });
    
                    holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                        @Override
                        public boolean onLongClick(View view) {
                            int pos = holder.getLayoutPosition();
                            mOnItemClickListener.onItemLongClick(view , pos);
                            return false;
                        }
                    });
                }
            }

     注意,这里更新数据集不是用adapter.notifyDataSetChanged()而是 notifyItemInserted(position)与notifyItemRemoved(position),否则没有动画效果。

  • 相关阅读:
    js设计模式 -- 拷贝模式
    超简单的SpringBoot整合mybatis
    使用JS调用手机本地摄像头或者相册图片识别二维码/条形码
    SpringBootsad整合EhCache做缓存处理
    调用微信的扫一扫功能详解说明---(java 排坑版)
    获取系统文件的创建日期
    在windows上获取文件创建时间
    简单计算器
    lambda-基于谓词筛选值序列
    IEnumerable<T>和IQueryable<T>区别
  • 原文地址:https://www.cnblogs.com/i-love-kobe/p/5542750.html
Copyright © 2011-2022 走看看