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);//設定adapter
mRecyclerView.setAdapter(adapter)
//設定Item增加、移除動畫
mRecyclerView.setItemAnimator(
//新增分割線
mRecyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.HORIZONTAL_LIST));
RecyclerView.LayoutManager吧,這是一個抽象類,好在系統提供了3個實現類:
-
LinearLayoutManager 現行管理器,支援橫向、縱向。
-
GridLayoutManager 網格佈局管理器
-
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>