1. 程式人生 > >Android學習之RecyclerView學習(實現瀑布流式佈局)

Android學習之RecyclerView學習(實現瀑布流式佈局)

RecyclerView,大家可以通過匯入support-v7對其進行使用。 

如果使用AndroidStudio開發, 需要在build.gradle中新增:

compile 'com.android.support:appcompat-v7:24.2.1'
compile 'com.android.support:design:24.2.1'

據官方的介紹,該控制元件用於在有限的視窗中展示大量資料集,其實這樣功能的控制元件我們並不陌生,例如:ListView、GridView。

整體上看RecyclerView架構,提供了一種插拔式的體驗,高度的解耦,異常的靈活,通過設定它提供的不同LayoutManager,ItemDecoration , ItemAnimator實現令人瞠目的效果。

  • 控制其顯示的方式,請通過佈局管理器LayoutManager

  • 控制Item間的間隔(可繪製),請通過ItemDecoration

  • 控制Item增刪的動畫,請通過ItemAnimator

  • 控制點選、長按事件(暫不支援)

RecyclerView的使用程式碼:

mRecyclerView = findView(R.id.id_recyclerview);//設定佈局管理器 mRecyclerView.setLayoutManager(layout);//設定adaptermRecyclerView.setAdapter(adapter)//設定Item增加、移除動畫mRecyclerView.setItemAnimator(

new DefaultItemAnimator());//新增分割線mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.HORIZONTAL_LIST));

RecyclerView.LayoutManager吧,這是一個抽象類,好在系統提供了3個實現類:

  1. LinearLayoutManager 現行管理器,支援橫向、縱向。

  2. GridLayoutManager 網格佈局管理器

  3. StaggeredGridLayoutManager 瀑布就式佈局管理器


RecyclerView提供自己的adapter:RecyclerView.Adapter,該介面卡已經集成了ViewHolder類,只需要實現裡面的onCreateViewHolder、onBindViewHolder抽象方法,具體使用如下:
package com.lzy.host.perfect.adapter;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;

import com.lzy.host.perfect.R;

import java.util.List;

/**
 * RecyclerViewAdapter
 *
 * @author linzhiyong
 * @time 2017年2月8日15:17:41
 * @email [email protected]
 * @desc
 */
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {

    private Context context;

    private List<Integer> data;

    public RecyclerViewAdapter(Context context, List<Integer> data) {
        this.context = context;
        this.data = data;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        MyViewHolder holder = new MyViewHolder(LayoutInflater.from(context).inflate(R.layout.item_recyclerview, parent, false));
        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        holder.imageView.setImageResource(this.data.get(position));
        if (position % 2 == 0) {
            holder.imageView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 300));
        } else {
            holder.imageView.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 400));
        }
    }

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

    class MyViewHolder extends RecyclerView.ViewHolder {

        private ImageView imageView;

        public MyViewHolder(View itemView) {
            super(itemView);
            this.imageView = (ImageView) itemView.findViewById(R.id.imageView1);
        }
    }

}

Activity:
package com.lzy.host.perfect.demo;

import android.os.Bundle;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.widget.TextView;

import com.lzy.host.perfect.R;
import com.lzy.host.perfect.activity.BaseActivity;
import com.lzy.host.perfect.adapter.RecyclerViewAdapter;

import java.util.ArrayList;
import java.util.List;

/**
 * RecyclerView
 *
 * @author linzhiyong
 * @time 2017年2月8日15:17:41
 * @email [email protected]
 * @desc
 */
public class RecyclerViewActivity extends BaseActivity {

    private TextView topTitleView;

    private RecyclerView recyclerView;
    private RecyclerViewAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo_recyclerview);
        topTitleView = (TextView) findViewById(R.id.base_top_title);
        topTitleView.setText("RecyclerView");

        recyclerView = (RecyclerView) findViewById(R.id.recyclerView);

        adapter = new RecyclerViewAdapter(this, createData());

        recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL));
        recyclerView.setAdapter(adapter);
    }

    private List<Integer> createData() {
        List<Integer> data = new ArrayList<Integer>();
        for (int i = 0; i < 100; i++) {
            if (i % 2 == 0) {
                data.add(R.mipmap.ic_demo_circle);
            } else {
                data.add(R.mipmap.ic_address_male);
            }
        }
        return data;
    }
}

佈局檔案:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <include layout="@layout/base_top_title" />

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

</LinearLayout>

介面卡item佈局檔案:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="5dp">

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:scaleType="centerCrop" />

</LinearLayout>