上一片文章我们讲到,设置布局管理器,可以有三种情况(1)线性布局管理器,(2)垂直grid布局管理器(3)水平grid布局管理器
我们只是实验了第一种,现在给大家展示下第二种和第三种,其它代码不用变,只需改变下MainActivity中第四步即可
package com.example.acer.wang_xue_gang_2016_6_5;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private List<String> data;
private MyAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//第一步:获取控件
RecyclerView rl_RecylerView = (RecyclerView) findViewById(R.id.rl);
//第二步:初始化数据
initData();
//第三部:设置适配器
myAdapter = new MyAdapter(this, data);
rl_RecylerView.setAdapter(myAdapter);
//第四部:设置布局管理器,与ListView不同的地方——————线性布局管理器,垂直/水平grid布局管理器
//设置线性布局管理器
rl_RecylerView.setLayoutManager(new LinearLayoutManager(this));
//设置垂直grid布局管理器
//rl_RecylerView.setLayoutManager(new GridLayoutManager(this,3));
//设置水平布局管理器
// rl_RecylerView.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.HORIZONTAL));
//第五步:添加分割线
rl_RecylerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
}
public void initData() {
data = new ArrayList<String>();
for (int i = 0; i < 100; i++) {
data.add("张欣爱我" + i + "生" + i + "世");
}
}
}
大家看下效果,可以上下滑动
//设置垂直grid布局管理器
rl_RecylerView.setLayoutManager(new GridLayoutManager(this,3));
可以水平滑动
//设置水平布局管理器
rl_RecylerView.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.HORIZONTAL));
在这里需要注意的是:设置水平的grid布局管理器:item的布局的宽度不管用match_parent 还是wrap_content都会被认为是wrap_content,一般我们设置为固定的高度值
我们这样写也有不足,那就是没有竖直方向的分割线
我们自己定义一个分割线!
先定义垂直grid布局管理器的分割线
//rl_RecylerView.setLayoutManager(new GridLayoutManager(this,3));
分割线既要画水平方向,也要画垂直方向,google提供的是,垂直或者水平方向,
分割线如下:
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.acer.test_18_04_02;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
public class DividerGridItemDecoration extends RecyclerView.ItemDecoration {
private static final int[] ATTRS = new int[]{
android.R.attr.listDivider
};
public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
private Drawable mDivider;
private int mOrientation;
public DividerGridItemDecoration(Context context, int orientation) {
final TypedArray a = context.obtainStyledAttributes(ATTRS);
mDivider = a.getDrawable(0);
//改自己的图片:
// mDivider = context.getResources().getDrawable(R.mipmap.ic_launcher);
a.recycle();
setOrientation(orientation);
}
public void setOrientation(int orientation) {
if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
throw new IllegalArgumentException("invalid orientation");
}
mOrientation = orientation;
}
//分割线既要画水平方向,也要画垂直方向,google提供的是,垂直或者水平方向,所以我们要去掉i(){}else{}
@Override
public void onDraw(Canvas c, RecyclerView parent) {
// if (mOrientation == VERTICAL_LIST) {
drawVertical(c, parent);
// } else {
drawHorizontal(c, parent);
// /}
}
public void drawVertical(Canvas c, RecyclerView parent) {
// parent.getAdapter().get
/* final int left = parent.getPaddingLeft();
final int right = parent.getWidth() - parent.getPaddingRight();*/
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
//布局信息都放在params里。可以通过params拿到外边距
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
//params.leftMargin是外边距
final int left = child.getLeft() - params.leftMargin;
final int right = child.getRight()+ params.rightMargin;
final int top = child.getBottom() + params.bottomMargin;
final int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
public void drawHorizontal(Canvas c, RecyclerView parent) {
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
final int left = child.getRight() + params.rightMargin;
final int right = left + mDivider.getIntrinsicWidth();
final int top = child.getTop() - params.topMargin;
final int bottom = child.getBottom() + params.bottomMargin;
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
/**
* 每一个条目之间预留的高度--- 高度就等于分割线图片的高度
* @param outRect
* @param itemPosition
* @param parent
*
* itemPosition = 2 不要画右边 ( 2+1)%3=0
* 5 (5+1)%3=0
* 8 (8+1)%3=0
* 11
* 13
*
*
* 3 不要画右边 (3+1)%4=0
* 7 (7+1)%4=0
*
*
*/
//我们要做的是如何预留空间
@Override
public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
Log.i("tz","itemPosition:"+itemPosition);
Log.i("tz","条目的数量 :" + parent.getAdapter().getItemCount());
RecyclerView.LayoutManager layoutManager =parent.getLayoutManager();
//只有网格布局才有列数,所以需要强转
int spanCount = ((GridLayoutManager)layoutManager).getSpanCount();
Log.i("tz", "列数:" + spanCount);
int right = mDivider.getIntrinsicWidth();
int bottom = mDivider.getIntrinsicWidth();
//最右侧不要画分割线
if((itemPosition+1)%spanCount ==0){
right = 0;
}
int allItem=parent.getAdapter().getItemCount();
if(itemPosition>allItem-spanCount-1){
bottom=0;
}
/*if(){
bottom = 0; 作业
}*/
outRect.set(0, 0,right, bottom);
// outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
}
}
https://www.cnblogs.com/anni-qianqian/p/6587329.html
这里有篇文章,自己可以看看学学