An_RecyclerView點(diǎn)擊+分割線

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);
     //設(shè)置分割線
        rv.addItemDecoration(new MyDecoration(this));
        //條目點(diǎn)擊吐司
        myadapter.setOnItemClickListener(new OnitemClickListener() {
            @Override
            public void onItemClick(int position) {
                Toast.makeText(MainActivity.this,"http:///"+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>{
        //調(diào)用接口
        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點(diǎn)擊事件
            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));
            //條目的點(diǎn)擊設(shè)置tag
                holder.itemView.setTag(position);
            //調(diào)節(jié)瀑布流的效果
//            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);
            }
        }
    }
    //點(diǎn)擊條目的接口
    public interface  OnitemClickListener{
        //傳個(gè)參數(shù)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)
    {
        // 列數(shù)
        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 且縱向滾動(dòng)
            if (orientation == StaggeredGridLayoutManager.VERTICAL)
            {
                childCount = childCount - childCount % spanCount;
                // 如果是最后一行觉痛,則不需要繪制底部
                if (pos >= childCount)
                    return true;
            } else
            // StaggeredGridLayoutManager 且橫向滾動(dòng)
            {
                // 如果是最后一行躺酒,則不需要繪制底部
                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());
        }
    }

}

設(shè)置分割線顏色
在項(xiàng)目的res下的drawable里新建一個(gè)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>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末轩勘,一起剝皮案震驚了整個(gè)濱河市筒扒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绊寻,老刑警劉巖花墩,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異澄步,居然都是意外死亡观游,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門驮俗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來懂缕,“玉大人,你說我怎么就攤上這事王凑√赂蹋” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵索烹,是天一觀的道長工碾。 經(jīng)常有香客問我,道長百姓,這世上最難降的妖魔是什么渊额? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮垒拢,結(jié)果婚禮上旬迹,老公的妹妹穿的比我還像新娘。我一直安慰自己求类,他們只是感情好奔垦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著尸疆,像睡著了一般椿猎。 火紅的嫁衣襯著肌膚如雪惶岭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天犯眠,我揣著相機(jī)與錄音按灶,去河邊找鬼。 笑死筐咧,一個(gè)胖子當(dāng)著我的面吹牛鸯旁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嗜浮,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼摩疑!你這毒婦竟也來了危融?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤雷袋,失蹤者是張志新(化名)和其女友劉穎吉殃,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體楷怒,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛋勺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鸠删。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片抱完。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖刃泡,靈堂內(nèi)的尸體忽然破棺而出巧娱,到底是詐尸還是另有隱情,我是刑警寧澤烘贴,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布禁添,位于F島的核電站,受9級(jí)特大地震影響桨踪,放射性物質(zhì)發(fā)生泄漏老翘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一锻离、第九天 我趴在偏房一處隱蔽的房頂上張望铺峭。 院中可真熱鬧,春花似錦汽纠、人聲如沸逛薇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽永罚。三九已至啤呼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呢袱,已是汗流浹背官扣。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留羞福,地道東北人惕蹄。 一個(gè)月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像治专,于是被迫代替她去往敵國和親卖陵。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容