RecyclerView實現瀑布流布局

來源:互聯網
上載者:User

標籤:瀑布流   android   動畫   布局   

RecyclerView本身提供了三個LayoutManager的實現

  • LinearLayoutManager
  • GridLayoutManager
  • StaggeredGridLayoutManager

第一個和第二個大家比較常用,今天我們就來使用第三個比較陌生的StaggeredGridLayoutManager,讓你分分鐘實現瀑布流布局。
首先來看下最後的效果

好吧,讓我們來實現它吧
首先是Item的布局masonry_item.xml很簡單,就是一張圖片加文字,item背景設定為白色

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:background="@color/white">    <ImageView        android:id="@+id/masonry_item_img"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:adjustViewBounds="true"        android:scaleType="centerCrop"/>    <TextView        android:id="@+id/masonry_item_title"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:gravity="center"/></LinearLayout>

為了簡單起見,我們假設每個item的資料是一個產品資訊

public class Product {    private int img;    private String title;    public Product(int img, String title) {        this.img = img;        this.title = title;    }    public int getImg() {        return img;    }    public void setImg(int img) {        this.img = img;    }    public String getTitle() {        return title;    }    public void setTitle(String title) {        this.title = title;    }}

recyclerView的adapter也很簡單,構造方法接受產品列表資料來源

public class MasonryAdapter extends RecyclerView.Adapter<MasonryAdapter.MasonryView>{    private List<Product> products;    public MasonryAdapter(List<Product> list) {        products=list;    }    @Override    public MasonryView onCreateViewHolder(ViewGroup viewGroup, int i) {        View view= LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.masonry_item, viewGroup, false);        return new MasonryView(view);    }    @Override    public void onBindViewHolder(MasonryView masonryView, int position) {        masonryView.imageView.setImageResource(products.get(position).getImg());        masonryView.textView.setText(products.get(position).getTitle());    }    @Override    public int getItemCount() {        return products.size();    }    public static class MasonryView extends  RecyclerView.ViewHolder{        ImageView imageView;        TextView textView;       public MasonryView(View itemView){           super(itemView);           imageView= (ImageView) itemView.findViewById(R.id.masonry_item_img );           textView= (TextView) itemView.findViewById(R.id.masonry_item_title);       }    }}

主介面Activity代碼就可以把資料來源和view連起來了

 @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        recyclerView= (RecyclerView) findViewById(R.id.recycler);        //設定layoutManager        recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL));        //設定adapter        initData();        MasonryAdapter adapter=new MasonryAdapter(productList);        recyclerView.setAdapter(adapter);        //設定item之間的間隔        SpacesItemDecoration decoration=new SpacesItemDecoration(16);        recyclerView.addItemDecoration(decoration);    }

第一
大家看到我們把recyclerview的layoutManager設定成了

new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL)

參數含義顯而易見,2就是2列,第二個參數是垂直方向

第二

SpacesItemDecoration decoration=new SpacesItemDecoration(16);recyclerView.addItemDecoration(decoration);

設定間隔,我們自訂了一個SpacesItemDecoration,代碼非常簡單

public class SpacesItemDecoration extends RecyclerView.ItemDecoration {    private int space;    public SpacesItemDecoration(int space) {        this.space=space;    }    @Override    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {        outRect.left=space;        outRect.right=space;        outRect.bottom=space;        if(parent.getChildAdapterPosition(view)==0){            outRect.top=space;        }    }}

重點就這2個地方 ,幾行代碼就實現了一個漂亮的瀑布流布局,有興趣自己去玩下哦。

RecyclerView實現瀑布流布局

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.