android Recyclerview使用解析!

Recyclerview已经出来差不多有2年左右了,通过对控件的了解及使用发现Recyclerview与其他控件比较起来具有高度的解耦,异常的灵活的特性。

我们可以通过导入Support-v7包进行使用:

Recyclerview 有充分的定制自由,它可实现以下多种效果:

1.listview横向、纵向数据展示。

2.gridview网格布局数据展示。

3.StaggeredGrid瀑布流式布局数据展示。


想要实现效果,只需要为Recyclerview设置布局管理器及关联adapter就可以显示数据展示效果,其使用代码:

//找到Recyclerview控件

mRecyclerView = findView(R.id.id_recyclerview);

①.listview代码设置:

//设置布局管理器

mRecyclerView.setLayoutManager(new LinearLayoutManager(dataActivity));

//设置adapter

mRecyclerView.setAdapter(adapter)。

一般情况下如果不设置滑动方向,默认是纵向滑动,想要实现横向滑动,只需要在设置布局管理器的地方做更改就可以:

//设置布局管理器

// mRecyclerView.setLayoutManager(new LinearLayoutManager(dataActivity));替换成以下布局就好:

mRecyclerViewsetLayoutManager(new LinearLayoutManager(activity,LinearLayoutManager.HORIZONTAL,false));

②.girdview代码设置:

//设置布局管理器

mRecyclerView.setLayoutManager(new GridLayoutManager(this,4));//只需要更改布局管理器就可实现效果。

//设置adapter

mRecyclerView.setAdapter(adapter)。

③.瀑布流式代码设置:

此效果与gridview效果一致,如果需要实现瀑布流式效果,只需要在adapter的onBindViewHolder方法中为我们的item设置个随机的高度就可以,当然也支持横向和纵向数据展示:

//设置布局管理器

mRecyclerView.setLayoutManager(newStaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));//纵向

//mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.HORIZONTAL));//横向

//设置adapter

mRecyclerView.setAdapter(adapter)。

下面我们来看看adapter的设置方法代码(单纯的使用方法,不含瀑布流式等效果):

public class AttachmentMaterAdapter extends RecyclerView.Adapter<AttachmentMaterAdapter.AttachmentMaterHolder>{

 

    private Context context;

    private List<MaterialBean> materLists;

 

    public AttachmentMaterAdapter(Context context,List<MaterialBean> materLists) {

        this.context = context;

        this.materLists = materLists;

    }

 

    @Override

    public AttachmentMaterHolderonCreateViewHolder(ViewGroup parent, int viewType) {

        View view= LayoutInflater.from(context).inflate(R.layout.material_list_item,null);//此处为引入item的xml文件比较简单就不贴出来了。

        AttachmentMaterHolder holder=new AttachmentMaterHolder(view);

        return holder;

    }

 

    @Override

    public void onBindViewHolder(AttachmentMaterHolderholder, int position) {

        MaterialBean info=materLists.get(position);

        if(info!=null){

           holder.icon.setBackgroundResource(info.getIcon());

           holder.textView.setText(info.getName());

        }

    }

 

    @Override

    public int getItemCount() {

        return materLists.size();

    }

 

    public class AttachmentMaterHolder extends ViewHolder{

        private ImageView icon;

        private TextView textView;

 

        public AttachmentMaterHolder(View itemView) {

            super(itemView);

            icon= (ImageView) itemView.findViewById(R.id.icon);

            textView= (TextView) itemView.findViewById(R.id.text);

        }

    }

}

  • Activity的布局文件

·       <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"

·           xmlns:tools="http://schemas.android.com/tools"

·           android:layout_width="match_parent"

·           android:layout_height="match_parent" >

·        

·           <android.support.v7.widget.RecyclerView

·               android:id="@+id/id_recyclerview"

·                android:divider="#ffff0000"

·                  android:dividerHeight="10dp"

·               android:layout_width="match_parent"

·               android:layout_height="match_parent" />

·        

·       </RelativeLayout>


在Acitvity中的onCreate中引用代码:

   @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

mRecyclerView = findView(R.id.id_recyclerview);

//设置布局管理器

mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

//设置adapter

mRecyclerView.setAdapter(new AttachmentMaterAdapter(this,“数据集”));

    }

以上代码是实现初步的简单效果大致为(效果图借用洪洋大神的,希望不要介意哦!):

listview效果:

gridview效果:

瀑布流式效果:


为了实现更炫酷的效果,我们可加入可选操作:

//设置Item增加、移除动画

mRecyclerView.setItemAnimator(new DefaultItemAnimator());

这是系统为我们提供的一个默认的实现类,值得注意,这里更新数据集需要用 notifyItemInserted(position)notifyItemRemoved(position) ,而不是notifyDataSetChanged()否则没有动画效果。

其中分割线的添加需要在代码中设置:

//添加分割线

mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.HORIZONTAL_LIST));

其中ItemDecoration需要我们自己去实现,重写该方法计算分割线。

在Recyclerview中如果我们需要添加点击事件或者长按事件需要我们自己在adapter中去添加代码如下(以点击事件为例):

public class AttachmentMaterAdapter extends RecyclerView.Adapter<AttachmentMaterAdapter.AttachmentMaterHolder>

        implements OnClickListener{

 

    private Context context;

    private List<MaterialBean> materLists;

    private OnRecyclerViewItemClickListener mOnItemClickListener = null;

 

    public AttachmentMaterAdapter(Context context,List<MaterialBean> materLists) {

        this.context = context;

        this.materLists = materLists;

    }

 

    public static interface OnRecyclerViewItemClickListener {

        void onItemClick(View view , MaterialBeanmaterDatas);

    }

 

    @Override

    public AttachmentMaterHolderonCreateViewHolder(ViewGroup parent, int viewType) {

        View view= LayoutInflater.from(context).inflate(R.layout.material_list_item,null);

        AttachmentMaterHolder holder=new AttachmentMaterHolder(view);

        view.setOnClickListener(this);

        return holder;

    }

 

    @Override

    public void onBindViewHolder(AttachmentMaterHolderholder, int position) {

        MaterialBean info=materLists.get(position);

        holder.itemView.setTag(info);

        if(info!=null){

           holder.icon.setBackgroundResource(info.getIcon());

           holder.textView.setText(info.getName());

        }

    }

 

    @Override

    public int getItemCount() {

        return materLists.size();

    }

 

    public class AttachmentMaterHolder extends ViewHolder{

        private ImageView icon;

        private TextView textView;

 

        public AttachmentMaterHolder(View itemView) {

            super(itemView);

            icon= (ImageView) itemView.findViewById(R.id.icon);

            textView= (TextView) itemView.findViewById(R.id.text);

        }

    }

 

    @Override

    public void onClick(View v) {

        if (mOnItemClickListener != null) {

            //注意这里使用getTag方法获取数据

            mOnItemClickListener.onItemClick(v,(MaterialBean)v.getTag());

        }

    }

 

    public void setOnItemClickListener(OnRecyclerViewItemClickListenerlistener) {

        this.mOnItemClickListener = listener;

    }

}

Recyclerview就介绍到这里,值得注意的地方是它的插入和删除数据的时候刷新是先调用notifyItemChanged(position);

再调用:notifyItemRangeChanged(position, itemCount);

希望能够帮助到你,有不正之处望指正,谢谢。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值