那么有了ListView、GridView为什么还需要RecyclerView这样的控件呢?
整体上看RecyclerView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。
  • 你想要控制其显示的方式,请通过布局管理器LayoutManager
  • 你想要控制Item间的间隔(可绘制),请通过ItemDecoration
  • 你想要控制Item增删的动画,请通过ItemAnimator
  • 你想要控制点击、长按事件,请自己写!
为了使用RecyclerView控件,我们需要创建一个Adapter和一个LayoutManager:
Adapter:集成自RecyclerView.Adapetr类,主要用来将数据和布局item进行绑定。
LayoutManager:布局管理器,设置每一项view在RecyclerView中的位置布局以及控件item view的显
RecyclerView提供了三种内置的LayoutManager:
  1. LinearLayoutManager:线性布局,横向或者纵向滑动列表
  2. GridLayoutManager:表格布局
  3. StaggeredGridLayoutManager:流式布局
今天我们主要来看看瀑布流的使用



首页我们在主Activity写自己的布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.five.test.recyclerview.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/linear_recycler"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

接着来书写自己的适配器的代码,进行页面的展示

public class MyAdapter  extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
    Context mcontext;
    List<String> mlist;
    List<Integer> mheight;
    public MyAdapter(Context context, List<String> list) {
        mcontext=context;
        mlist=list;
        //随机高度集合
        mheight=new ArrayList<Integer>();
        for(int i=0;i<mlist.size();i++){
            mheight.add((int)(100+Math.random()*300));
        }
    }




    @Override
    public int getItemCount() {

        return mlist.size();
    }


    //找到布局中空间位置
    class MyViewHolder extends RecyclerView.ViewHolder{
        TextView tv;
        public MyViewHolder(View arg0) {
            super(arg0);

            tv=(TextView) arg0.findViewById(R.id.id_num);
        }

    }


    //绑定,渲染数据到view中
    @Override
    public void onBindViewHolder(MyViewHolder holder, int arg1) {

        ViewGroup.LayoutParams lp=holder.tv.getLayoutParams();
        lp.height=mheight.get(arg1);
        holder.tv.setLayoutParams(lp);
        holder.tv.setText(mlist.get(arg1));


    }



    //先执行onCreateViewHolder
    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int arg1) {

        MyViewHolder holder = new MyViewHolder(LayoutInflater.from(
                mcontext).inflate(R.layout.item, parent,
                false));
        return holder;
    }




    public void add(int pos) {

        mlist.add(pos, "insert");
        mheight.add((int)(100+Math.random()*300));
        notifyItemInserted(pos);
    }




    public void del(int pos) {

        mlist.remove(pos);
        notifyItemRemoved(pos);
    }


}

添加自己的适配器的布局文件

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:background="#93AFA0"
    android:layout_margin="3dp"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/id_num"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:gravity="center"
        android:text="1" />
</FrameLayout>


最后进行主的Activity的数据,用来写要展示的数据,以及需要的变量值


 RecyclerView recyclerView;
    List<String> mlist;
    MyAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();

        initview();

    }
    private void initview() {
        recyclerView=(RecyclerView) findViewById(R.id.linear_recycler);
        adapter=new MyAdapter(this,mlist);
        //设置动画
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        //设置分割线
        //recyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
        //recyclerView.setLayoutManager(new LinearLayoutManager(this));
        //设置布局
        recyclerView.setLayoutManager(new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.VERTICAL));
        recyclerView.setAdapter(adapter);
    }

 //用来展示的数据

    private void initData() {
        mlist=new ArrayList<String>();
        for(int i=0;i<50;i++){
            mlist.add("Staggereditem"+i);
        }

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.

        switch (item.getItemId())
        {
            case R.id.add:
                adapter.add(1);
                break;
            case R.id.del:
                adapter.del(1);
                break;
        }

        return true;
    }
其中的menu是android中的三大键的使用,在这里主要用来放在手机的右上角进行对条目的增加和删除的操作的

这里附上menu的代码,其中的id是用来写自己的控制按钮的,title是要对这个按钮的进行命名

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/add" android:title="add"></item>
    <item android:id="@+id/del" android:title="del"></item>
</menu>

最后就是我们最关注的效果了,在这里

recyclerView实现瀑布流


分类:

技术点:

相关文章: