当前位置: 代码迷 >> Android >> android v7兼容包RecyclerView的使用(3)——布局管理器的使用
  详细解决方案

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

热度:69   发布时间:2016-04-28 02:05:42.0
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

  相关解决方案