最近项目里优化的时候,之前使用GridView和ListView的,然后统一改成了RecyclerView,发现性能能提升不少,左右滑动的时候,比之前更顺畅,从字面意思来看:可回收的View,自然对提升性能方面会比较好,还没仔细研究源码,这里给出简单使用,供大家参考,其实有了这个view,GridView和ListView可以不用了。它都能实现,好,贴出代码。
第一步:引入相关的依赖
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile files('src/main/libs/universal-image-loader-1.9.3.jar')
compile 'com.android.support:support-v4:22.2.1'
compile 'com.android.support:recyclerview-v7:22.2.0'
}
第二步:设计相关页面
activity页面activity_recycler_view.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#c5efc6"
tools:context="com.figo.study.activity.RecyclerViewActivity">
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/recyclerView_test"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
RecyclerView头部layout_rv_head.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:background="#ffffff"
android:layout_width="match_parent" android:layout_height="match_parent"
android:gravity="center"
android:layout_marginBottom="10dp">
<TextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="相冊"/>
</LinearLayout>
RecyclerView数据项layout_rv_item.xml
<?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">
<LinearLayout
android:id="@+id/layoutContent"
android:background="#ffffff"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/img_icon"
android:layout_width="match_parent"
android:layout_height="100dp"
android:src="@mipmap/ic_launcher"
android:scaleType="fitXY" />
</LinearLayout>
</LinearLayout>
第三步:编写Activity RecyclerViewActivity.java
package com.figo.study.activity;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.figo.study.R;
import com.figo.study.utils.CommonUtil;
import java.util.ArrayList;
public class RecyclerViewActivity extends Activity {
RecyclerView mRecyclerView;
PhotoAdapter mPhotoAdapter;
ArrayList<Integer> imgs = null;
int rvHead = 0;
int rvItem = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler_view);
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView_test);
bindDataToRv();
}
private void bindDataToRv() {
//测试,使用系统自带的图标
imgs = new ArrayList<Integer>();
for (int a = 0; a < 100; a++) {
imgs.add(R.mipmap.ic_launcher);
}
//一、实现GridView效果,两列,第一列合并
GridLayoutManager gridLayoutMgr = new GridLayoutManager(this, 2);
//第一行,两列合并为一列,作为标题
gridLayoutMgr.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
if (position == 0) {
return 2;
}
return 1;
}
});
mRecyclerView.setLayoutManager(gridLayoutMgr);
//二、实现ListView效果
/*
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(linearLayoutManager);
*/
//三、实现交错效果 (5,StaggeredGridLayoutManager.VERTICAL)表示显示5列,更多数据上下滑动
// (5,StaggeredGridLayoutManager.HORIZONTAL) 表示显示5行,更多数据左右滑动
// StaggeredGridLayoutManager staggeredGridLayoutManager=new StaggeredGridLayoutManager(5,StaggeredGridLayoutManager.HORIZONTAL);
// mRecyclerView.setLayoutManager(staggeredGridLayoutManager);
if (mPhotoAdapter == null) {
mPhotoAdapter = new PhotoAdapter();
}
//数据绑定到RecyclerView
mRecyclerView.setAdapter(mPhotoAdapter);
}
class PhotoAdapter extends RecyclerView.Adapter<PhotoAdapter.PhotoViewHolder> {
@Override
public PhotoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
PhotoViewHolder holder = null;
//根据view类型选择不同的加载项
if (viewType == rvHead) {
holder = new PhotoViewHolder(LayoutInflater.from(RecyclerViewActivity.this).inflate(R.layout.layout_rv_head, parent,
false), true);
} else {
holder = new PhotoViewHolder(LayoutInflater.from(RecyclerViewActivity.this).inflate(R.layout.layout_rv_item, parent,
false), false);
}
return holder;
}
@Override
public void onBindViewHolder(PhotoViewHolder holder, int position) {
if (position == 0) {
holder.tvTitle.setText("This is Photo Album");
} else {
//设置RecyclerView横竖间距
//Gridview效果
LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) holder.layoutContent.getLayoutParams();
if (position % 2 == 0) {
layoutParams.setMargins(CommonUtil.dp2px(10, RecyclerViewActivity.this), 0, CommonUtil.dp2px(10, RecyclerViewActivity.this), CommonUtil.dp2px(10, RecyclerViewActivity.this));
} else {
layoutParams.setMargins(CommonUtil.dp2px(10, RecyclerViewActivity.this), 0, 0, CommonUtil.dp2px(10, RecyclerViewActivity.this));
}
holder.layoutContent.setVisibility(View.VISIBLE);
//ListView效果
// layoutParams.setMargins(0, 0, 0, CommonUtil.dp2px(10, RecyclerViewActivity.this));
//设置图片
holder.imgIcon.setImageResource(imgs.get(position - 1));//因为第一项是title
}
}
//返回view类型
@Override
public int getItemViewType(int position) {
if (position == 0) {
return rvHead;
} else {
return rvItem;
}
}
@Override
public int getItemCount() {
return imgs.size() + 1;//第一项是title,需要多加一项
}
class PhotoViewHolder extends RecyclerView.ViewHolder {
ImageView imgIcon;
TextView tvTitle;
LinearLayout layoutContent;
public PhotoViewHolder(View view, boolean isHead) {
super(view);
if (isHead) {
tvTitle = (TextView) view.findViewById(R.id.tv_title);
} else {
layoutContent = (LinearLayout) view.findViewById(R.id.layoutContent);
imgIcon = (ImageView) view.findViewById(R.id.img_icon);
}
}
}
}
}