RecycleView使用

1 创建布局文件的时候用到recycleView的时候,如何引用:

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    />

2 在初始化recycleview的时候,需要导包

import android.support.v7.widget.RecyclerView;

3 导入后可能发现不了这个包,因为虽然它是包含在v7包中,但是不一定能发现,所以在studio的项目build.gradle文件中需要加上引用。

compile 'com.android.support:recyclerview-v7:25.2.0+'

加入之后,包也就没问题了。


初始化的时候如果不设置管理者就会不显示任何图像,是不能用的。

大神的方法是:

mRecyclerView = findView(R.id.id_recyclerview);

//设置布局管理器 想listView 一样的列表

mRecyclerView.setLayoutManager(new LinearLayoutManager(this);

//如果像横向显示,并设置横向显示一行条目个数:

//横向显示,一行5个

//recallBinding.recyclerRecallShopstyle.setLayoutManager(new StaggeredGridLayoutManager(5, StaggeredGridLayoutManager.VERTICAL));

mRecyclerView.setHasFixeSize(true);//不解释

//设置adapter

mRecyclerView.setAdapter(adapter);

//设置Item增加、移除动画系统自带的动画,挺漂亮的

mRecyclerView.setItemAnimator(new DefaultItemAnimator());

//添加分割线

mRecyclerView.addItemDecoration(new DividerItemDecoration(  

getActivity(), DividerItemDecoration.HORIZONTAL_LIST));  

//这个分割线后边也有代码,也是copy鸿翔大神的。

在下使用的是横向显示三张图片,所以用的是下面的方法。

compileBinding.recyclerDynamic.setLayoutManager(new GridLayoutManager(this, 3));
compileBinding.recyclerDynamic.setItemAnimator(new DefaultItemAnimator());
compileBinding.recyclerDynamic.addItemDecoration(new MyDividerGridItemDecoration(CompileActivity.this));


4 我现在只需要recycle的点击事件,需要将adapter单独写成一个类,我在这个类中直接循环了一下做了一个数据源,仅仅是个例子而已。

当然,如果你想在调用的时候直接将数据源数组传递近来,就在构造方法

private Context mcontext;

private List<String> strings;

public HomeAdapter(Context context, List<String>  s){

     mcontext = context;//传递对象

    strings = s;//这样你在调用的时候就可以将数据源传递近来直接赋值使用了

}

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.List;

/**
 * Created by Administrator on 2017/4/6 0006.
 */

//给recycle设置适配器
public class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder> {
    private List<String> strings;
    private Context mcontext;

    public HomeAdapter(Context context, List<String> strings) {
        this.mcontext = context;
        this.strings = strings;

    }


    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        MyViewHolder holder = new MyViewHolder(LayoutInflater.from(mcontext).inflate(R.layout.item_recycle, parent, false));
        return holder;
    }

    public interface OnItemClickLitener {
        void onItemClick(View view, int position);

        void onItemLongClick(View view, int position);
    }

    private OnItemClickLitener mOnItemClickLitener;

    public void setOnItemClickLitener(OnItemClickLitener mOnItemClickLitener) {
        this.mOnItemClickLitener = mOnItemClickLitener;
    }


    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {

        if (mOnItemClickLitener != null) {
            holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int pos = holder.getLayoutPosition();
                    mOnItemClickLitener.onItemClick(holder.itemView, pos);
                }
            });

            holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    int pos = holder.getLayoutPosition();
                    mOnItemClickLitener.onItemLongClick(holder.itemView, pos);
                    return false;
                }
            });
        }
    }

    @Override
    public int getItemCount() {
        return strings.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder {


        public MyViewHolder(View view) {
            super(view);
        }
    }
}



public void addItem(int position,String s) {
    strings.add(position,s);
    notifyItemInserted(position);
}
public void removeItem(int position) {
    strings.remove(position);
    notifyItemRemoved(position);
}


//如果需要添加在数组末尾:

public void addItem(RefillResult.ListBean s) {
    strings.add(s);
    notifyItemInserted(strings.size());
}
public void removeItem(int position) {
    strings.remove(position);
    notifyItemRemoved(position);
}


如果条目横向显示三张图片,让每个条目之间的间隔可以控制,就需要手动绘制分割线:

代码可以直接拷贝:

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.RecyclerView;
import android.support.v7.widget.RecyclerView.LayoutManager;
import android.support.v7.widget.RecyclerView.State;
import android.support.v7.widget.StaggeredGridLayoutManager;
import android.view.View;

/**
 *
 * @author zhy
 *
 */
public class MyDividerGridItemDecoration extends RecyclerView.ItemDecoration
{

    private static final int[] ATTRS = new int[] { android.R.attr.listDivider };
    private Drawable mDivider;

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

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

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

    }

    private int getSpanCount(RecyclerView parent)
    {
        // 列数
        int spanCount = -1;
        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)
    {
        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)
    {
        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());
        }
    }
}

使用这个类的方法:

拿recycleView的对象,添加就可以了。

recycleCompile.addItemDecoration(new MyDividerGridItemDecoration(CompileActivity.this));


在adapter中有遇到一种情况:  展示的条目中有一个删除按钮,点击之后删除当前点击按钮

如果这个操作在activity或者fargment中,那是相当方便,因为拿到当前点击位置非常容易!

但是如果这个操作在adapter中,怎么拿到当前点击的位置呢?


思路是: 在数据源就是传入这个列表的数据中,对每个条目设定一个唯一身份标识符

                在点击删除的时候,遍历整个数组,用for(int i = 0; i < strings.size() ;i++){}  来遍历,这样如果身份相同, i +1  就是这个条目当前所在列表的位置!

int position = 0;
for (int i = 0; i < dynamicList.size(); i++) {
    if (dynamic == dynamicList.get(i)) {
        position = i;
        break;
    }//最重要的地方===》 ==  号前后的值要确保  1 类型  2 内容  全部一致,否则,你只能删除0位上的内容
}

拿到位置,用数组删除这个位置的元素,刷新界面. ,当然也可以局部刷新!


到,有的话记者@我


至此结束,谢谢观看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值