RecycleView的使用,并添加子item的点击事件

简介: 1.导入 compile ‘com.android.support:recyclerview-v7:23.3.0’2.准备工作(间隔)import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import

1.导入

compile ‘com.android.support:recyclerview-v7:23.3.0’

2.准备工作(间隔)

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.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;

/**
 * This class is from the v7 samples of the Android SDK. It's not by me!
 * <p/>
 * See the license above for details.
 */
public class DividerItemDecoration 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 DividerItemDecoration(Context context, int orientation)
    {
        final TypedArray a = context.obtainStyledAttributes(ATTRS);
        mDivider = a.getDrawable(0);
        a.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)
    {
        Log.v("recyclerview - itemdecoration", "onDraw()");
         if (mOrientation == VERTICAL_LIST) {
                drawVertical(c, parent);
            } else {
                drawHorizontal(c, parent);
            }
    }

    public void drawVertical(Canvas c, RecyclerView parent)
    {
        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);
            android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(
                    parent.getContext());
            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 drawHorizontal(Canvas c, RecyclerView parent)
    {
        final int top = parent.getPaddingTop();
        final 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.getIntrinsicHeight();
            mDivider.setBounds(left, top, right, bottom);
            mDivider.draw(c);
        }
    }

    @Override
    public void getItemOffsets(Rect outRect, int itemPosition,
            RecyclerView parent)
    {
        if (mOrientation == VERTICAL_LIST)
        {
            outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
        } else
        {
            outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
        }
    }
}


//TypedArray a = context.obtainStyledAttributes(ATTRS)
//这里是拿到一个间隔的样式
//如果想自定义可以去 Style 文件利用listDivider编辑
//<item name="android:listDivider">@drawable/diver_cr</item>
//diver_cr.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:startColor="#66666666"
        android:endColor="#ff4c4c4c"
        android:centerColor="#808080"
        android:angle="45"
        android:type="linear"/>
    <size android:height="4dp"/>
</shape>

3.开始使用

  • xml 的编写
  • 简单的Adapter编写
/**
 * author Phyooos
 * date 16/5/3.
 */
public class CrAdapter  extends RecyclerView.Adapter<CrViewHodle>{

    ArrayList<String> mdata ;
    private Context mContext;
    private LayoutInflater inflater;

    //构造传参
    public CrAdapter(Context mContext ,ArrayList<String> mdata) {
        this.mdata = mdata;
        this.mContext = mContext;
        this.inflater = LayoutInflater.from(mContext);
    }

    //绑定数据
    @Override
    public void onBindViewHolder(CrViewHodle holder, int position) {
        holder.textView.setText(mdata.get(position));
    }

    //加载iten布局并创建ViewHolder
    @Override
    public CrViewHodle onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.item_recycle,parent,false);
        CrViewHodle hodle = new CrViewHodle(view);
        return hodle;
    }


    //条目总数
    @Override
    public int getItemCount() {
        return mdata.size();
    }
}
//各个控件声明,初始化
class CrViewHodle  extends RecyclerView.ViewHolder {
    TextView textView;
    public CrViewHodle(View itemView) {
        super(itemView);
        textView = (TextView) itemView.findViewById(R.id.text);
    }
}

4.在Activity中使用

        //获得CrAdapter
        crAdapter = new CrAdapter(this,mDatas);
        //设置CrAdapter
        mRecyclerView.setAdapter(crAdapter);
        //Context   VERTICAL或者HORIZONTAL的样式
        manager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
        mRecyclerView.setLayoutManager(manager);
        //设置Item动画
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        //设置间隔    Context  以及mRecyclerView样式,与上面一致
            mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL_LIST));

5.添加点击事件

这个大概有2种比较方便的方法来实现
但是个人比较倾向于在
onBindViewHolder中给控件带上参数来使用setOnClickListener

例子:
1.定义一个接口

/**
 * @author: phyooos on 16.6.22 09:58.
 * @E-mail: phyooos@163.com
 */
public interface OnRecycleItemListener {
    void OnRecycleItemClick(View v,Object o);
}

我发现Object o每一次都需要转化,很麻烦
也可以这样使用,

public interface OnRecycleItemListener <T>{
    void OnRecycleItemClick(View v,T o);
}

PS;参数什么的自己定义即可,用什么就定义什么

2.在onBindViewHolder给要添加的view设置点击事件

 @Override
    public void onBindViewHolder(TypeViewHolder holder, int position) {
       ActivityItemModel itemModel = model.getDatalist().get(position);
        holder.textView.setText(itemModel.getName());
        holder.textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.OnRecycleItemClick(v,itemModel);
            }
        });
    }

使用setOnClickListener并在其中调用接口中的OnRecycleItemClick

3.那么上面listener对象需要定义出来

private OnRecycleItemListener listener;

4.最后一步就是定义一个对外开放的方法

public void addRecycleItemListener(OnRecycleItemListener listener){
        this.listener = listener;
}

到此为止,你可以在activity中给创建出来的adapter实例添加点击事件,并在回调中处理各种事件

5在activity中使用

 //在activity中对recycleView的adapter(listAdapter)添加子项目的点击事件
 listAdapter.addRecycleItemListener(listener);
-------------------------------------------------
 OnRecycleItemListener<Prize> listener = new OnRecycleItemListener<Prize>() {
        @Override
        public void OnRecycleItemClick(View v, final Prize p) {
            switch (v.getId()){
                case R.id.act_list_edit:
                    //在这里处理Item的点击事件即可
                    break;
             }
        }
};
相关文章
|
iOS开发
iOS开发 - touchBegan事件判断点击的位置在View上还是在View的子View上
iOS开发 - touchBegan事件判断点击的位置在View上还是在View的子View上
236 0
iOS开发 - touchBegan事件判断点击的位置在View上还是在View的子View上
|
前端开发
使用scroll-view实现一个滑动列表
使用scroll-view实现一个滑动列表
150 1
使用scroll-view实现一个滑动列表
|
Android开发 数据格式 XML
ListView项(Item)的三种布局
转载自:ListView项(Item)的三种布局使用例子 List中的item布局有三种: 自定义的布局,使用了相对布局(RelativeLayout,见list_item.
719 0
|
Java Android开发
NestedScrollView嵌套RecyclerView最后一条item显示不全
NestedScrollView嵌套RecyclerView最后一条item显示不全 首先要在最外层的NestedScrollView配置属性 android:fillViewport="true": 然后在上层Ja...
8022 0
|
Android开发
view.performClick()触发点击事件
1、主要作用      自动触发控件的点击事件 2、界面的布局文件  activity_main.xml 3、MainActivity 代码     package com.
1298 0