美文网首页
An_RecyclerView点击+分割线

An_RecyclerView点击+分割线

作者: android_en | 来源:发表于2017-09-28 16:12 被阅读23次

MainActivity

package com.example.recyclerview_click20170927;

import android.graphics.drawable.Drawable;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
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.StaggeredGridLayoutManager;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    RecyclerView rv;
    List<String> list;
    MyAdapter myadapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        rv= (RecyclerView) findViewById(R.id.rv);
        initData();
        LinearLayoutManager mgr=new LinearLayoutManager(this);
        rv.setLayoutManager(mgr);
        //瀑布流
//           StaggeredGridLayoutManager mgr=new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL);
//           rv.setLayoutManager(mgr);
        //GrideView
//        GridLayoutManager mgr=new GridLayoutManager(this,3);
//        rv.setLayoutManager(mgr);
        myadapter=new MyAdapter();
        rv.setAdapter(myadapter);
     //设置分割线
        rv.addItemDecoration(new MyDecoration(this));
        //条目点击吐司
        myadapter.setOnItemClickListener(new OnitemClickListener() {
            @Override
            public void onItemClick(int position) {
                Toast.makeText(MainActivity.this,"///"+position,Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void initData() {
        list=new ArrayList<>();
        for(int i=0;i<25;i++){
            list.add("text"+i);
        }
    }
    class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
        //调用接口
        OnitemClickListener listener;
        //
        public void setOnItemClickListener(OnitemClickListener listener){
            this.listener=listener;
        }
        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view= LayoutInflater.from(MainActivity.this).inflate(R.layout.item,parent,false);
//           View view=View.inflate(parent.getContext(),R.layout.item,null);
            MyViewHolder holder=new MyViewHolder(view);
            //view点击事件
            view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    if(listener!=null){
                        listener.onItemClick((Integer) view.getTag());
                    }

                }
            });
            return holder;
        }

        @Override
        public void onBindViewHolder(MyViewHolder holder, int position) {
                holder.tv.setText(list.get(position));
            //条目的点击设置tag
                holder.itemView.setTag(position);
            //调节瀑布流的效果
//            LinearLayout.LayoutParams lp=new LinearLayout.LayoutParams(
//                    LinearLayout.LayoutParams.MATCH_PARENT,
//                    100+(int)(Math.random()*50));
//            holder.iv.setLayoutParams(lp);
        }

        @Override
        public int getItemCount() {
            return list==null ? 0:list.size();
        }
        //MyViewHolder
        class MyViewHolder extends RecyclerView.ViewHolder{
            TextView tv;
            ImageView iv;
            public MyViewHolder(View itemView) {
                super(itemView);
                tv= (TextView) itemView.findViewById(R.id.tv);
                iv= (ImageView) itemView.findViewById(R.id.iv);
            }
        }
    }
    //点击条目的接口
    public interface  OnitemClickListener{
        //传个参数position
        public void onItemClick(int position);
    }

}

主布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.recyclerview_click20170927.MainActivity">

    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/rv"
        android:divider="#ffff0000"
        android:dividerHeight="10dp"
        >

    </android.support.v7.widget.RecyclerView>
</RelativeLayout>

分割线的class--------继承(RecyclerView.ItemDecoration )

package com.example.recyclerview_click20170927;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.support.annotation.ColorInt;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;

/**
 * 作者: ${Liuentong} on2017/9/27 13:55
 */
public class MyDecoration extends RecyclerView.ItemDecoration {
//    private Context mContext;
//    private Drawable mDivider;
//    private int mOrientation;
//    public static final int HORIZONTAL_LIST= LinearLayoutManager.HORIZONTAL;
//    public static final int VERTICAL_LIST= LinearLayoutManager.VERTICAL;
//    public static final int[] ATRRS =new int[]{
//      android.R.attr.listDivider
//    };
//    public MyDecoration(Context context,int orientation){
//        this.mContext=context;
//        final TypedArray ta=context.obtainStyledAttributes(ATRRS);
//        this.mDivider=ta.getDrawable(0);
//        ta.recycle();
//        setOrientation(orientation);
//    }
//    public void setOrientation(int orientation){
//        if(orientation !=HORIZONTAL_LIST && orientation!=VERTICAL_LIST){
//            throw new IllegalArgumentException("invalid orientation");
//        }mOrientation=orientation;
//    }
//
//    @Override
//    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
//        if(mOrientation==HORIZONTAL_LIST){
//            drawVerticalLine(c,parent,state);
//        }else{
//            drawHorizontalLine(c,parent,state);
//        }
//    }
//    public void drawHorizontalLine(Canvas c,RecyclerView parent,RecyclerView.State state){
//        int left=parent.getPaddingLeft();
//        int right=parent.getWidth()-parent.getPaddingRight();
//        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 top =child.getBottom()+params.bottomMargin;
//            final int bottom=top+mDivider.getIntrinsicHeight();
//            mDivider.setBounds(left,top,right,bottom);
//            mDivider.draw(c);
//        }
//    }
//    public void drawVerticalLine(Canvas c,RecyclerView parent,RecyclerView.State state){
//        int top=parent.getPaddingTop();
//        int bottom=parent.getHeight()-parent.getPaddingBottom();
//        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();
//            mDivider.setBounds(left,top,right,bottom);
//            mDivider.draw(c);
//        }
//    }
//
//    @Override
//    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
//        if(mOrientation==HORIZONTAL_LIST){
//            outRect.set(0,0,mDivider.getIntrinsicWidth(),0);
//
//        }else{
//            outRect.set(0,0,0,mDivider.getIntrinsicHeight());
//        }
//    }
private static final int[] ATTRS = new int[] { android.R.attr.listDivider };
    private Drawable mDivider;

    public MyDecoration(Context context)
    {
        final TypedArray a = context.obtainStyledAttributes(ATTRS);
        mDivider = a.getDrawable(0);
        a.recycle();
    }

    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state)
    {

        drawHorizontal(c, parent);
        drawVertical(c, parent);

    }

    private int getSpanCount(RecyclerView parent)
    {
        // 列数
        int spanCount = -1;
        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
        if (layoutManager instanceof GridLayoutManager)
        {

            spanCount = ((GridLayoutManager) layoutManager).getSpanCount();
        } else if (layoutManager instanceof StaggeredGridLayoutManager)
        {
            spanCount = ((StaggeredGridLayoutManager) layoutManager)
                    .getSpanCount();
        }
        return spanCount;
    }

    public void drawHorizontal(Canvas c, RecyclerView parent)
    {
        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.getLeft() - params.leftMargin;
            final int right = child.getRight() + params.rightMargin
                    + mDivider.getIntrinsicWidth();
            final int top = child.getBottom() + params.bottomMargin;
            final int bottom = top + mDivider.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    public void drawVertical(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 top = child.getTop() - params.topMargin;
            final int bottom = child.getBottom() + params.bottomMargin;
            final int left = child.getRight() + params.rightMargin;
            final int right = left + mDivider.getIntrinsicWidth();

            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    private boolean isLastColum(RecyclerView parent, int pos, int spanCount,
                                int childCount)
    {
        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
        if (layoutManager instanceof GridLayoutManager)
        {
            if ((pos + 1) % spanCount == 0)// 如果是最后一列,则不需要绘制右边
            {
                return true;
            }
        } else if (layoutManager instanceof StaggeredGridLayoutManager)
        {
            int orientation = ((StaggeredGridLayoutManager) layoutManager)
                    .getOrientation();
            if (orientation == StaggeredGridLayoutManager.VERTICAL)
            {
                if ((pos + 1) % spanCount == 0)// 如果是最后一列,则不需要绘制右边
                {
                    return true;
                }
            } else
            {
                childCount = childCount - childCount % spanCount;
                if (pos >= childCount)// 如果是最后一列,则不需要绘制右边
                    return true;
            }
        }
        return false;
    }

    private boolean isLastRaw(RecyclerView parent, int pos, int spanCount,
                              int childCount)
    {
        RecyclerView.LayoutManager layoutManager = parent.getLayoutManager();
        if (layoutManager instanceof GridLayoutManager)
        {
            childCount = childCount - childCount % spanCount;
            if (pos >= childCount)// 如果是最后一行,则不需要绘制底部
                return true;
        } else if (layoutManager instanceof StaggeredGridLayoutManager)
        {
            int orientation = ((StaggeredGridLayoutManager) layoutManager)
                    .getOrientation();
            // StaggeredGridLayoutManager 且纵向滚动
            if (orientation == StaggeredGridLayoutManager.VERTICAL)
            {
                childCount = childCount - childCount % spanCount;
                // 如果是最后一行,则不需要绘制底部
                if (pos >= childCount)
                    return true;
            } else
            // StaggeredGridLayoutManager 且横向滚动
            {
                // 如果是最后一行,则不需要绘制底部
                if ((pos + 1) % spanCount == 0)
                {
                    return true;
                }
            }
        }
        return false;
    }

    @Override
    public void getItemOffsets(Rect outRect, int itemPosition,
                               RecyclerView parent)
    {
        int spanCount = getSpanCount(parent);
        int childCount = parent.getAdapter().getItemCount();
        if (isLastRaw(parent, itemPosition, spanCount, childCount))// 如果是最后一行,则不需要绘制底部
        {
            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
        } else if (isLastColum(parent, itemPosition, spanCount, childCount))// 如果是最后一列,则不需要绘制右边
        {
            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
        } else
        {
            outRect.set(0, 0, mDivider.getIntrinsicWidth(),
                    mDivider.getIntrinsicHeight());
        }
    }

}

设置分割线颜色
在项目的res下的drawable里新建一个divider.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:centerColor="#ff00ff00"
        android:endColor="#ff0000ff"
        android:startColor="#ffff0000"
        android:type="linear" />
    <size android:height="4dp"/>


</shape>

相关文章

  • An_RecyclerView点击+分割线

    MainActivity 主布局 分割线的class--------继承(RecyclerView.ItemDec...

  • 分列-快速提取有效信息

    选中数据 ---> 点击分列 点击 “其他” , 输入“省” , 点击一下,在安徽后面创建分割线,点击确定 不规...

  • 关于TableVIew部分属性

    1,设置cell之间没有分割线 2,设置点击没有效果

  • UITableView 使用

    UITableView 取消点击cell的选中颜色 UITableView 去掉cell分割线 UITableVi...

  • 回头看看自己走过的路

    2eqwwweqwqe das w 大读完 qweqwe 点击回去 qweqew 听说这是分割线

  • 关于listview的一些属性

    1.设置条目的点击效果 2.设置listview的分割线属性(为了美观一般设置为没有分割线,设置为@null) 3...

  • Xcode9-去掉打印警告信息

    应用启动,首先打印出分割线上的信息,点击输入手机号的textField(键盘类型设置为纯数字) 打印分割线之下的信...

  • 实现tableViewCell分割线(全屏)

    代码下载地址 iOS7后分割线默认左边是有15个像素的边距 1. 设置边距 点击这篇文章tableView分割线设...

  • swift -tableviewCell 分割线

    在cell添加了一个View,充当分割线,但是在点击的时候会出现闪的情况。 解决方法:去掉分割线的View。通过o...

  • 关于tableView

    1.去掉多余的分割线 2.去掉cell点击的高亮效果 3.cell点击不变色 4.cell内添加button 点...

网友评论

      本文标题:An_RecyclerView点击+分割线

      本文链接:https://www.haomeiwen.com/subject/igfvextx.html