Android 自定义RecyclerView 实现真正的Gallery效果

转载请标明出处:,本文出自:【张鸿洋的博客】

上一篇博客我使用自定义HorizontalScrollView写了一个具有HorizontalScrollView效果和ViewPager特性的横向图片轮播,详见:Android 自定义 HorizontalScrollView 打造再多图片(控件)也不怕 OOM 的横向滑动效果。其实制作横向滚动的不得不说另一个控件,就是Google官方最近新增加的RecyclerView,据说是ListView的升级版本,本篇博客,首先介绍RecyclerView的用法,然后经行一定的分析;最后自定义一下RecyclerView实现我们需要的相册效果。

1、RecyclerView的基本用法

首先主Activity的布局文件:

<RelativeLayout xmlns:android=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent" ><android.support.v7.widget.RecyclerViewandroid:id="@+id/id_recyclerview_horizontal"android:layout_width="match_parent"android:layout_height="120dp"android:layout_centerVertical="true"android:background="#FF0000"android:scrollbars="none" /></RelativeLayout>Item的布局文件:<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android=""android:layout_width="120dp"android:layout_height="120dp"android:background="@drawable/item_bg02" ><ImageViewandroid:id="@+id/id_index_gallery_item_image"android:layout_width="80dp"android:layout_height="80dp"android:layout_alignParentTop="true"android:layout_centerHorizontal="true"android:layout_margin="5dp"android:scaleType="centerCrop" /><TextViewandroid:id="@+id/id_index_gallery_item_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/id_index_gallery_item_image"android:layout_centerHorizontal="true"android:layout_marginBottom="5dp"android:layout_marginTop="5dp"android:textColor="#ff0000"android:text="some info"android:textSize="12dp" /></RelativeLayout>数据适配器:package com.example.zhy_horizontalscrollview03;import java.util.List;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.TextView;public class GalleryAdapter extendsRecyclerView.Adapter<GalleryAdapter.ViewHolder>{private LayoutInflater mInflater;private List<Integer> mDatas;public GalleryAdapter(Context context, List<Integer> datats){mInflater = LayoutInflater.from(context);mDatas = datats;}public static class ViewHolder extends RecyclerView.ViewHolder{public ViewHolder(View arg0){super(arg0);}ImageView mImg;TextView mTxt;}@Overridepublic int getItemCount(){return mDatas.size();}/** * 创建ViewHolder */@Overridepublic ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i){View view = mInflater.inflate(R.layout.activity_index_gallery_item,viewGroup, false);ViewHolder viewHolder = new ViewHolder(view);viewHolder.mImg = (ImageView) view.findViewById(R.id.id_index_gallery_item_image);return viewHolder;}/** * 设置值 */@Overridepublic void onBindViewHolder(final ViewHolder viewHolder, final int i){viewHolder.mImg.setImageResource(mDatas.get(i));}}可以看到数据适配器与BaseAdapter比较发生了相当大的变化,主要有3个方法:

getItemCount 这个不用说,获取总的条目数

onCreateViewHolder 创建ViewHolder

onBindViewHolder 将数据绑定至ViewHolder

可见,RecyclerView对ViewHolder也进行了一定的封装,但是如果你仔细观察,你会发出一个疑问,ListView里面有个getView返回View为Item的布局,那么这个Item的样子在哪控制?

其实是这样的,我们创建的ViewHolder必须继承RecyclerView.ViewHolder,这个RecyclerView.ViewHolder的构造时必须传入一个View,这个View相当于我们ListView getView中的convertView (即:我们需要inflate的item布局需要传入)。

还有一点,ListView中convertView是复用的,在RecyclerView中,是把ViewHolder作为缓存的单位了,然后convertView作为ViewHolder的成员变量保持在ViewHolder中,也就是说,假设没有屏幕显示10个条目,则会创建10个ViewHolder缓存起来,每次复用的是ViewHolder,所以他把getView这个方法变为了onCreateViewHolder。有兴趣的自己打印下Log,测试下。

最后在Activity中使用:

package com.example.zhy_horizontalscrollview03;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.Window;public class MainActivity extends Activity{private RecyclerView mRecyclerView;private GalleryAdapter mAdapter;private List<Integer> mDatas;@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);initDatas();//得到控件mRecyclerView = (RecyclerView) findViewById(R.id.id_recyclerview_horizontal);//设置布局管理器LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);mRecyclerView.setLayoutManager(linearLayoutManager);//设置适配器mAdapter = new GalleryAdapter(this, mDatas);mRecyclerView.setAdapter(mAdapter);}private void initDatas(){mDatas = new ArrayList<Integer>(Arrays.asList(R.drawable.a,R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e,R.drawable.f, R.drawable.g, R.drawable.h, R.drawable.l));}}使用起来也很方便,唯一的区别就是要设置LayoutManager,目前只有一个实现类,就是LinearLayoutManager,可以设置为水平或者垂直。

最后效果图:

效果很不错,这就是RecyclerView的基本用法了,但是你会发现一个坑爹的地方,竟然没有提供setOnItemClickListener这个回调,要不要这么坑爹。。。

2、为RecyclerView添加OnItemClickListener回调

虽然它没有提供,但是添加个OnItemClickListener对我们来说还不是小菜一碟~

如果心胸不似海,又怎能有海一样的事业。

Android 自定义RecyclerView 实现真正的Gallery效果

相关文章:

你感兴趣的文章:

标签云: