material design(二)RecycleView的使用详解

前言:

上一篇[material design(一)CardView的使用详解](http://blog.csdn.net/fine1938768839/article/details/68925736介绍了material design的第一个控件cradview,这个控件使用起来十分简单,但是效果却非常好,这篇文章是介绍material design的一个最重要最强大的控件—–recycleview。

优势:

  1. 更大强大。recycleview可以一秒变换listview,gridview以及流式布局。
  2. 更大可靠。recycleview强制使用viewholder,内部做了优化,使得控件效率更高。
  3. 可扩展性高。recyclevview做到了真正的解耦合,可以配置多种参数。
  4. 继承自NestedScrollingChild,控件交互效果更多样
    5.。。。

本篇文章主要是介绍recycleview的基本使用方法,主要包括加载数据,间隔设置,增删动画以及点击事件等等。。

使用:

1.看activity中代码:

public class ListViewActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private ListViewAdapter mListViewAdapter;
    private List<ListBean> mBeen=new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list_view);
        mRecyclerView= (RecyclerView) findViewById(R.id.recycle_view);
        //关键,LayoutManager是用来区别listivew,gradview不同效果的。
        LinearLayoutManager manager=new LinearLayoutManager(this);
        //默认是垂直,也可以设置成水平
        manager.setOrientation(LinearLayoutManager.VERTICAL);
        //加载manager,体现了松耦合
        mRecyclerView.setLayoutManager(manager);
        for(int i=0;i<30;i++){
            mBeen.add(new ListBean("zhangsan"+i+i));
        }
        mListViewAdapter=new ListViewAdapter();
        //加载适配器
        mRecyclerView.setAdapter(mListViewAdapter);

        mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        mListViewAdapter.setData(mBeen);
    }
}

mRecyclerView.setLayoutManager(manager);很重要,listview的效果就是LinearLayoutManager,gridview效果就是GridLayoutManager,StaggeredGridLayoutManager是瀑布流的效果。


mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));这是设置item的间隔,默认是没有间隔的。


mRecyclerView.setItemAnimator(new DefaultItemAnimator());这是设置数据变动的动画效果。

2.adapter

public class ListViewAdapter extends RecyclerView.Adapter<ListViewAdapter.ViewHolder> {

    private Context mContext;
    private List<ListBean> mData=new ArrayList<>();
    private LayoutInflater inflater;

    public List<ListBean> getData() {
        return mData;
    }

    public void setData(List<ListBean> data) {
        mData = data;
        notifyDataSetChanged();
    }

    public void addData(List<ListBean> data){
        mData.addAll(data);
        notifyDataSetChanged();
    }

    /**
     * 复用item布局
     * @param parent Recycleview
     * @param viewType type类型
     * @return 内部类viewhodler对象
     */

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if(mContext==null){
            mContext=parent.getContext();
            inflater=LayoutInflater.from(mContext);
        }
        View view= inflater.inflate(R.layout.listview_item,parent,false);
        Log.i("sssss1",parent.toString()+"    "+viewType);
        return new ListViewAdapter.ViewHolder(view);
    }

    /**
     *
     * @param holder onCreateViewHolder返回的holder
     * @param position 位置
     */
    @Override
    public void onBindViewHolder(ViewHolder holder, final int position) {
        Log.i("sssss2",holder.toString()+"    "+position);
        ListBean bean=mData.get(position);
        holder.mTextView.setText(bean.getName());
          //点击事件
        holder.mTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addData(position);
            }
        });
        //长按事件
        holder.mTextView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                removeData(position);
                return false;
            }
        });

    }

    @Override
    public int getItemViewType(int position) {
        return super.getItemViewType(position);
    }

    @Override
    public int getItemCount() {
        return mData.size();
    }

    /**
     * ViewHolder的内部类,View为item的布局,其他小的控件
     * 可以findviewbyid获得,这个view就是textview
     */
    static class ViewHolder extends RecyclerView.ViewHolder{
        private TextView mTextView;
        public ViewHolder(View itemView) {
            super(itemView);
            mTextView= (TextView) itemView;
        }
    }
    //增加数据,调用notifyItemInserted才有动画
    public void addData(int position) {
        mData.add(position, new ListBean("Insert One"));
        notifyItemInserted(position);
    }

//删除数据,调用notifyItemRemoved才有动画
    public void removeData(int position) {
        mData.remove(position);
        notifyItemRemoved(position);
    }
}

数据绑定和listview的用法差不多,点击事件需要我们自己写,同时增删数据调用的方法也需要注意。

实际上,以上两个类就可以把recycleview集成到我们项目中去了,但是对于recycleview的数据刷新和加载功能,控件是没有提供默认的方法的,需要我们自己来写,下篇文章会重点分析一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值