android v7兼容包RecyclerView的使用(三)——布局管理器的使用

前两篇文章
android v7兼容包RecyclerView的使用(二)
android v7兼容包RecyclerView的使用(一)
介绍了RecyclerView的基本用法以及与它相关的重要的几个类,本篇文章介绍布局管理器的具体用法。

为了演示布局管理器的使用,找了很多个例子,都没有找到感觉合适的例子,后来google了一把,发现了一个比较适合说明问题的例子。所以就拿该例子来解释吧。

在演示布局管理器前,我们先把UI部分搭建完成。由于使用到了V7兼容包的另一个包CardView,所以在这之前我们先把该项目导入eclipse,并设置为library,该项目目录在sdk\extras\android\support\v7\cardview
然后我们新建我们的项目将该库引入,之后将RecyclerView.jar加入到libs目录下,这样基本算配置完成了。开始编写代码。
item使用CardView,代码如下

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="5dp"
    android:orientation="horizontal"
    card_view:cardCornerRadius="5dp"
    card_view:cardUseCompatPadding="true" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <TextView
            android:id="@+id/info_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:gravity="center"
            android:textColor="@android:color/black"
            android:textSize="24sp" />
    </RelativeLayout>

</android.support.v7.widget.CardView>

创建适配器,代码前两篇文章已经讲解过了,这里不再讲解

package cn.edu.zafu.layoutmanager;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class CardViewAdapter extends
        RecyclerView.Adapter<CardViewAdapter.ViewHolder> {
    //数据集
    public String[] data;

    public CardViewAdapter(String[] data) {
        this.data = data;
    }

    @Override
    public CardViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
            int viewType) {
        //绑定布局
        View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(
                R.layout.item, null);
        //创建ViewHolder
        ViewHolder viewHolder = new ViewHolder(itemLayoutView);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int position) {
        //绑定数据
        viewHolder.info.setText(data[position].toString());

    }

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

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView info;

        public ViewHolder(View itemLayoutView) {
            super(itemLayoutView);
            info = (TextView) itemLayoutView.findViewById(R.id.info_text);

        }
    }

}

在主布局文件中生声明RecyclerView

<?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:background="#c9c9c9"
    android:orientation="vertical" >

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

</LinearLayout>

在activity中使用,这里先简单创建一个线性布局管理器。

package cn.edu.zafu.layoutmanager;


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.RecyclerView.LayoutManager;
import android.support.v7.widget.StaggeredGridLayoutManager;

public class MainActivity extends Activity {
    private RecyclerView mRecyclerView;
    private RecyclerView.Adapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String[] data = { "StaggeredGridLayoutManager", "LayoutManager", "GridLayoutManager", "Adapter", "ViewHolder",
                "LinearLayoutManager", "CardView", "ListView", "TextView",
                "Vertical", "Horizontal", "RecyclerView" };

        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerview);


        //如果布局大小一致有利于优化
        mRecyclerView.setHasFixedSize(true);

        //使用线性布局管理器
        LayoutManager layout = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(layout);


        //初始化适配器并绑定适配器
        mAdapter = new CardViewAdapter(data);
        mRecyclerView.setAdapter(mAdapter);
    }
}

现在看一下运行效果。
技术分享

效果是不是还可以,基本上和ListView的效果一致。
好了,那么现在我们来修改一下代码,将关注点移动到布局管理器上。
先看LinearLayoutManager,该类有两个构造函数。

LinearLayoutManager(context)
LinearLayoutManager(context, orientation, reverseLayout)

第一个参数是Context,第二个参数是布局方向,其值可以取

LinearLayoutManager.HORIZONTAL 水平
LinearLayoutManager.VERTICAL 垂直

第三个参数是是否逆向布局如果设置为true,则反向开始布局,现在我们将布局设置为水平,并逆向布局,使用下面的代码

LayoutManager layout = new LinearLayoutManager(this,LinearLayoutManager.HORIZONTAL,true);

现在的效果是这样的。
技术分享

可以看出,所有的数据是从右向左布局的,这就是逆向布局。

此外,布局管理器里还有一些其他方法,请参见api文档。

用过了线性布局,我们再换一个布局,

LayoutManager layout=new GridLayoutManager(this,2);

网格布局,设置2列,默认垂直布局。效果图如下。
技术分享

将它改成3列

LayoutManager layout=new GridLayoutManager(this,3);

技术分享

跟线性布局一样,网格布局还有一个构造函数,其意义同线性布局,这里,我们不适用逆向布局,设置2列,垂直,效果跟之前的图一样。

LayoutManager layout=new GridLayoutManager(this, 2, GridLayoutManager.VERTICAL, false);

还有一个布局管理器就是流式布局管理器,该类只有一个构造函数,一个是列数或者行数,另一个是布局方向,依然看代码

LayoutManager layout=new StaggeredGridLayoutManager(2,StaggeredGridLayoutManager.VERTICAL);

效果呢,就是现在很流行的流式布局,在各大购物网站都可以看到这种效果。
技术分享

至此,v7兼容包内置的几个布局管理器都使用了一番,那么有什么感受呢,是的,两个字,就是灵活,可以看出,从开篇到结尾,我们就只是修改了一行代码,就达到了不同的效果,这就是布局管理器的灵活之处,我们也可以去继承LayoutManager重写我们自己的布局管理器,本人水平有限,无法达到这一层次,有兴趣的可以去尝试一下。
当然布局管理的用法不仅仅是上面说到的这一点点,还有很多的方法等待我们去挖掘。

源码下载
http://download.csdn.net/detail/sbsujjbcy/8494401

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。