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重写我们自己的布局管理器,本人水平有限,无法达到这一层次,有兴趣的可以去尝试一下。
当然布局管理的用法不仅仅是上面说到的这一点点,还有很多的方法等待我们去挖掘。