Android5.0 RecyclerView的使用

刚刚开始写博客,拿一些简单出来练练手,Demo地址就不贴出来了,RecyclerView的适配器我一直都是使用CaMnter的EasyAdapter,这里贴出的地址可以参考下:https://github.com/CaMnter/EasyRecyclerView ,感觉鸿洋大神的BaseAdapter有点绕,就使用这个了。下面Adapter是随手写的...

然而

注意的地方:

  • 设置布局管理器 mRecyclerView.setLayoutManager(mLayoutManager)
    • LinearLayoutLayoutManager(线性布局管理器)
    • StaggeredGridLayoutManager(流式布局管理器)
  • 在adapter中添加item点击事件和长按事件的接口
  • 添加RecyclerView上拉加载更多和下拉刷新事件监听(避免重复刷新)
  • 添加item的分割线,mRecyclerView.addItemDecoration(this.mItemDecoration);下面提供继承ItemDecoration的类,不作详述

布局(layout)

\res\layout\activity_main.xml
<?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:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.aqtc.recyclerviewdemo.MainActivity">

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/swipe_refresh"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

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

    </android.support.v4.widget.SwipeRefreshLayout>

</RelativeLayout>
\res\layout\item_view.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="70dp">

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="Hello, RecylerView!"
        android:textSize="20sp"
        android:gravity="center"
        android:textColor="@color/colorPrimary"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true" />
</RelativeLayout>

代码(java)

Mainactivity
private void initView() {
    mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh);
    // mLinearLayoutManger= (LinearLayoutManager) mRecyclerView.getLayoutManager();
    mLinearLayoutManger = new LinearLayoutManager(this);
}

private void initData() {
    MainAdapter adapter = new MainAdapter(this);
     adapter.setOnItemClickListener(new MainAdapter.OnItemClickListener() {
        @Override
        public void onItemClick(View convertView, int position) {
            Toast.makeText(MainActivity.this,"Hello,RecyclerView!"+position,Toast.LENGTH_SHORT).show();
        }
    });
    mRecyclerView.setLayoutManager(mLinearLayoutManger);
    mRecyclerView.setAdapter(adapter);
}

private void initEvent() {
    mRecyclerView.addOnScrollListener(this.getRecyclerViewOnScrollListener());
    mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            refreshData();
        }
    });
}

private void setRefreshStaus(boolean refreshStaus) {
    mRefreshStaus = refreshStaus;
}

private void refreshData() {

    if (mRefreshStaus) return;
    Log.i("xys", "下拉加载更多");
    this.setRefreshStaus(true);
    mSwipeRefreshLayout.postDelayed(new Runnable() {
        @Override
        public void run() {
            Log.i("xys", "下拉已经加载更多数据了");
            mSwipeRefreshLayout.setRefreshing(false);
            setRefreshStaus(false);
        }
    }, 2000);

}

private void getMoreData() {
    if (mRefreshStaus) return;
    Log.i("xys", "上拉加载更多");
    this.setRefreshStaus(true);
    mSwipeRefreshLayout.post(new Runnable() {
        @Override
        public void run() {
            mSwipeRefreshLayout.setRefreshing(true);
        }
    });

    mSwipeRefreshLayout.postDelayed(new Runnable() {
        @Override
        public void run() {

            Log.i("xys", "上拉已经加载更多数据了");
            mSwipeRefreshLayout.setRefreshing(false);
            setRefreshStaus(false);
        }
    }, 2000);

}

public RecyclerView.OnScrollListener getRecyclerViewOnScrollListener() {
    return new RecyclerView.OnScrollListener() {
        private boolean toLast = false;
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            /**
             * firstVisiableItem:当前可见item  lastVisiableItem: 上一个可见item
             * dy: 表示y轴滑动方向 dy = firstVisiableItem-lastVisiableItem>0 上拉
             * dx: 表示x轴滑动方向
             */
            if (dy > 0) {
                //正在向下滑动/上拉
                this.toLast = true;
            } else {
                //停止滑动或者向上滑动/下拉
                this.toLast = false;
            }
        }

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {

            RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
            if (layoutManager instanceof LinearLayoutManager) {
                LinearLayoutManager manager = (LinearLayoutManager) layoutManager;
                //不滚动
                if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                    //最后完成显示的item的position正好是最后一掉数据的Index
                    if (toLast && manager.findLastCompletelyVisibleItemPosition() == (manager.getItemCount() - 1)) {
                        //上拉加载更多
                        getMoreData();
                    }
                }
            } else if (layoutManager instanceof StaggeredGridLayoutManager) {
                StaggeredGridLayoutManager manager = (StaggeredGridLayoutManager) recyclerView.getLayoutManager();
                //不滚动
                if (newState == RecyclerView.SCROLL_STATE_IDLE) {
                    /**
                     * 由于是StaggeredGridLayoutManager取最底部数据
                     * 可能有两个item,所以判断这之中有一个正好是最后一条数据的
                     * index就OK
                     */
                    int[] bottom = manager.findLastCompletelyVisibleItemPositions(new int[2]);
                    int lastItemCount = manager.getItemCount() - 1;
                    if (toLast && (bottom[0] == lastItemCount || bottom[1] == lastItemCount)) {
                        //上拉加载更多
                        Log.i("xys", "上拉加载更多");
                    }
                }
            }

        }
    };
}
MainAdapter
public class MainAdapter extends RecyclerView.Adapter<MainAdapter.ViewHolder> {

    private Context mContext;
    private MainAdapter.OnItemClickListener onItemClickListener = null;
    private MainAdapter.OnItemLongClickListener onItemLongClickListener = null;

    public MainAdapter(Context context) {

        mContext=context;
    }

    @Override
    public MainAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView=LayoutInflater.from(mContext).inflate(R.layout.item_view,parent,false);
        ViewHolder holder=new ViewHolder(itemView);
        return holder;
    }

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

        holder.itemView.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                onItemClickListener.onItemClick(holder.itemView,position);
            }
        });
        holder.setData(position);
    }

    @Override
    public int getItemCount() {
        return 50;
    }

    class ViewHolder extends RecyclerView.ViewHolder{

        private TextView tv_name;
        public ViewHolder(View itemView) {
            super(itemView);
            tv_name= (TextView) itemView.findViewById(R.id.tv_name);
        }
        public void setData(int position){
            tv_name.setText("Hello, RecyclerView!"+position);
        }
    }
 
    public void setOnItemClickListener(MainAdapter.OnItemClickListener onItemClickListener) {

        this.onItemClickListener = onItemClickListener;
    }

    public void setOnItemLongClickListener(MainAdapter.OnItemLongClickListener onItemLongClickListener) {

        this.onItemLongClickListener = onItemLongClickListener;
    }

    public interface OnItemClickListener {
        void onItemClick(View convertView, int position);
    }

    public interface OnItemLongClickListener {
        boolean onItemLongClick(View convertView, int position);
    }

}
EasyBorderDividerItemDecoration(分隔线)
public class EasyBorderDividerItemDecoration extends RecyclerView.ItemDecoration {

    private final int verticalItemSpacingInPx;
    private final int horizontalItemSpacingInPx;

    public EasyBorderDividerItemDecoration(int verticalItemSpacingInPx, int horizontalItemSpacingInPx) {
        this.verticalItemSpacingInPx = verticalItemSpacingInPx;
        this.horizontalItemSpacingInPx = horizontalItemSpacingInPx;
    }

    /**
     * set border
     *
     * @param outRect outRect
     * @param view view
     * @param parent parent
     * @param state state
     */
    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        RecyclerView.LayoutParams layoutParams = (RecyclerView.LayoutParams) view.getLayoutParams();
        int itemPosition = layoutParams.getViewLayoutPosition();
        int childCount = parent.getAdapter().getItemCount();

        int left = this.horizontalItemSpacingInPx;
        int right = this.horizontalItemSpacingInPx;

        int top = getItemTopSpacing(itemPosition);
        int bottom = getItemBottomSpacing(itemPosition, childCount);
        outRect.set(left, top, right, bottom);
    }

    /**
     * get the item bottom spacing
     *
     * @param itemPosition itemPosition
     * @param childCount childCount
     * @return int
     */
    private int getItemBottomSpacing(int itemPosition, int childCount) {
        if (isLastItem(itemPosition, childCount)) {
            return this.verticalItemSpacingInPx;
        }
        return this.verticalItemSpacingInPx / 2;
    }

    /**
     * get the item top spacing
     *
     * @param itemPosition itemPosition
     * @return int
     */
    private int getItemTopSpacing(int itemPosition) {
        if (isFirstItem(itemPosition)) {
            return this.verticalItemSpacingInPx;
        }
        return this.verticalItemSpacingInPx / 2;
    }

    /**
     * is the first item
     *
     * @param itemPosition itemPosition
     * @return boolean
     */
    private boolean isFirstItem(int itemPosition) {
        return itemPosition == 0;
    }

    /**
     * is the last item
     *
     * @param itemPosition itemPosition
     * @param childCount childCount
     * @return boolean
     */
    private boolean isLastItem(int itemPosition, int childCount) {
        return itemPosition == childCount - 1;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • RecylerView简介 RecylerView位置 RecylerView引用 Android Studio ...
    上善若水Ryder阅读 3,886评论 2 8
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,413评论 25 707
  • 首先介绍下RecyclerView,RecyclerView相比ListView增加了很多新特性: • Adapt...
    LucasAdam阅读 2,814评论 0 6
  • 今天谈论网红感觉有点晚了,但是我还是忍不住内心的小冲动,还是要在这里扯一下网红这个东西的存在。 先说一下我和网...
    非花流苏阅读 350评论 1 0
  • 很久没有休息了,每天都是工作。下班回家洗漱后,就一直捧着手机📱,直到要睡的时候才放下手机。一天就这样过了,第二天同...
    6c3fe58490c1阅读 226评论 0 1