前两篇文章
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