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),否则没有动画效果。

  • 相关阅读:
    Redis常用数据类型及应用场景之Set
    Redis常用数据类型及应用场景之List
    Redis常用数据类型及应用场景之Hash
    exists & not exists
    oracle 中 dblink 的简单使用
    DockerCompose之数据卷Volume
    DockerCompose之常见编排脚本
    160308-学习State Pattern Actor
    12.3-框架维护
    12.2-机器人协作系统
  • 原文地址:https://www.cnblogs.com/i-love-kobe/p/5542750.html
Copyright © 2011-2022 走看看