王学岗RecylerView( 二 )(itemtouchhelper自己学,不在更新)

上一片文章我们讲到,设置布局管理器,可以有三种情况(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
这里有篇文章,自己可以看看学学

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值