[AS2.1.3]RecyclerView的使用总结

RecyclerView是谷歌在5.0之后推出用来取代ListView和GridView的新控件。详细的说明,这边就不在复述了!这边只说下使用


本文主要内容如下:

1.RecyclerView切换模式

2.RecyclerView点击事件

3.RecyclerView判断滑动

4.综合全部代码


效果




首先是布局,主布局如下


<?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.gjn.recyclerviewdemo.MainActivity">


    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/rv_list"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="改变样式"
        android:id="@+id/btn_change"
        android:layout_alignBottom="@+id/rv_list"
        android:layout_alignEnd="@+id/rv_list" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="+"
        android:id="@+id/btn_add"
        android:layout_alignBottom="@+id/btn_change"
        android:layout_alignStart="@+id/rv_list" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="初始化"
        android:id="@+id/btn_re"
        android:layout_alignParentBottom="true"
        android:layout_toEndOf="@+id/btn_add" />

</RelativeLayout>

Item布局为一个ImageView

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="1"
    android:gravity="center"
    android:padding="5dp">

    <ImageView
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:id="@+id/iv_rv_item"
        android:src="@mipmap/img1" />
</LinearLayout>


下面开始实现

1.RecyclerView切换模式

首先将实现一个RecyclerView

rv = (RecyclerView) findViewById(R.id.rv_list);
//初始化recyclerview
rv.setLayoutManager(new LinearLayoutManager(this));
rv.setAdapter(adapter);

这边就做了

找到RecyclerView

设置RecyclerView的LayoutManager

设置适配器adapter


其中还可以设置

Item动画

rv.setItemAnimator(new DefaultItemAnimator());

RecyclerView的分割线

rv.addItemDecoration();
这边只说了下方法,具体实现并未添加到项目内


这边先将适配器的代码贴出来

RecyclerAdapter.java

package com.gjn.recyclerviewdemo;

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.ImageView;

import java.util.List;

/**
 * RecyclerAdapter
 * Author: gjn.
 * Time: 2017/3/10.
 */
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyVH> {
    public interface OnItemClickListener{
        void onClick(int i);
        void onLongClick(int i);
    }

    private final LayoutInflater mInflater;
    private List<Integer> mList;
    private OnItemClickListener listener;

    public RecyclerAdapter(Context context, List<Integer> mList) {
        this.mList = mList;
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public MyVH onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.rv_item, parent, false);
        MyVH vh = new MyVH(view);
        return vh;
    }

    @Override
    public void onBindViewHolder(MyVH holder, final int position) {
        holder.iv.setImageResource(mList.get(position));

        if (listener != null) {
            holder.iv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    listener.onClick(position);
                }
            });

            holder.iv.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    listener.onLongClick(position);
                    return false;
                }
            });
        }

    }

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

    public void addItem(int i,int img){
        mList.add(i,img);
        notifyItemInserted(i);
    }

    public void moveItem(int form,int to){
        int Item = mList.get(form);

        mList.remove(form);
        mList.add(to,Item);

        notifyItemMoved(form,to);
    }

    public void removeItem(int i){
        mList.remove(i);
        notifyItemRemoved(i);
    }

    public void setOnClickListener(OnItemClickListener listener){
        this.listener = listener;
    }

    class MyVH extends RecyclerView.ViewHolder{
        ImageView iv;
        public MyVH(View itemView) {
            super(itemView);
            iv = (ImageView) itemView.findViewById(R.id.iv_rv_item);
        }
    }
}
后续涉及到功能,我会单独贴下来功能!

下面开始实现几行代码改变RecyclerView的格式

首先格式有3种

LinearLayoutManager 线性布局
GridLayoutManager 网格布局
StaggeredGridLayoutManager 瀑布流布局


具体代码实现如下:

        btn_change.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                changeType();
            }
        });
    private void changeType() {
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(MainActivity.this);
        switch (Type) {
            case 0:
                Type = 1;
                mLayoutManager = new GridLayoutManager(MainActivity.this, 2);
                break;
            case 1:
                Type = 2;
                mLayoutManager = new StaggeredGridLayoutManager(3,
                        StaggeredGridLayoutManager.VERTICAL);
                break;
            case 2:
                Type = 3;
                mLayoutManager = new StaggeredGridLayoutManager(3,
                        StaggeredGridLayoutManager.HORIZONTAL);
                break;
            case 3:
                Type = 0;
                mLayoutManager = new LinearLayoutManager(MainActivity.this);
                break;
            default:
                break;
        }
        rv.setLayoutManager(mLayoutManager);
    }
为一个按钮添加了改变格式的点击事件。

修改格式代码只有一步


2.RecyclerView点击事件

点击事件就需要我们把代码写在适配器上面

主要代码如下

设置适配器Item点击事件

    public interface OnItemClickListener{
        void onClick(int i);
        void onLongClick(int i);
    }

    public void setOnClickListener(OnItemClickListener listener){
        this.listener = listener;
    }

    @Override
    public void onBindViewHolder(MyVH holder, final int position) {
        holder.iv.setImageResource(mList.get(position));

        if (listener != null) {
            holder.iv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    listener.onClick(position);
                }
            });

            holder.iv.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    listener.onLongClick(position);
                    return false;
                }
            });
        }

    }

主界面中实现

        adapter.setOnClickListener(new RecyclerAdapter.OnItemClickListener() {
            @Override
            public void onClick(int i) {
                Toast.makeText(MainActivity.this, "点击" + i, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onLongClick(int i) {
                Toast.makeText(MainActivity.this, "长按" + i, Toast.LENGTH_SHORT).show();
            }
        });



3.RecyclerView判断滑动

判断滑动中加入了两个内容

第一个内容是左右滑动删除item和长按item移动

这块功能主要由系统提供的ItemTouchHelper方法实现

代码如下

    private void setTouch() {
        WindowManager wm = getWindowManager();
        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);
        screenwidth = dm.widthPixels;

        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
            //设置滑动方向
            @Override
            public int getMovementFlags(RecyclerView recyclerView,
                                        RecyclerView.ViewHolder viewHolder) {
                int dragFlags = 0;
                int swipeFlags = 0;
                if (recyclerView.getLayoutManager() instanceof GridLayoutManager
                        || recyclerView.getLayoutManager() instanceof StaggeredGridLayoutManager) {
                    //网格布局  4个方向
                    dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN
                            | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
                } else if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
                    //线性布局  只有上下
                    dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
                    swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
                }
                //swipeFlags为0  item不滑动
                return makeMovementFlags(dragFlags, swipeFlags);
            }

            //长按拖拽
            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
                                  RecyclerView.ViewHolder target) {
                int from = viewHolder.getAdapterPosition();
                int to = target.getAdapterPosition();
                adapter.moveItem(from, to);
                return true;
            }

            //滑动删除
            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
                adapter.removeItem(viewHolder.getAdapterPosition());
            }

            @Override
            public boolean isLongPressDragEnabled() {
                //返回true  表示所有的item都可以拖拽
                return true;
            }

            //当item拖拽开始时调用
            @Override
            public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
                super.onSelectedChanged(viewHolder, actionState);
                if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {
                    //设置背景灰色
                    viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
                }
            }

            //当item拖拽完成时调用
            @Override
            public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
                super.clearView(recyclerView, viewHolder);
                //设置背景白色
                viewHolder.itemView.setBackgroundColor(Color.WHITE);
            }

            //当item视图变化时调用
            @Override
            public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
                super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
                //根据item滑动偏移的值修改item透明度。screenwidth是屏幕宽度
                viewHolder.itemView.setAlpha(1 - Math.abs(dX) / screenwidth);
            }
        });

        itemTouchHelper.attachToRecyclerView(rv);
    }



第二个内容就是判断界面是否移动到了最后一个,判断是否需要加载新的图片或者提示到底

具体代码如下

        rv.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                //newState:
                //  0   停止滚动
                //  1   正在滚动(用户还在触摸)
                //  2   正在滑动(由于惯性滑动)
                if (newState == RecyclerView.SCROLL_STATE_IDLE
                        && mLastItem + 1 >= mCount) {
                    if (adapter.getItemCount() <= 20) {
                        Toast.makeText(MainActivity.this, "加载新的图片中...", Toast.LENGTH_SHORT).show();
                        for (int i = 0; i < 6; i++) {
                            addItem(adapter.getItemCount());
                        }
                    } else {
                        Toast.makeText(MainActivity.this, "没有了", Toast.LENGTH_SHORT).show();
                    }
                }
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                getLast();
            }
        });

    private void addItem(int x) {
        int i = (int) (Math.random() * 5);
        if (adapter.getItemCount() == 0) {
            adapter.addItem(0,imgs[i]);
        } else {
            adapter.addItem(x,imgs[i]);
        }
    }

    private void getLast() {
        switch (Type) {
            case 0:
            case 1: {
                LinearLayoutManager layoutManager = (LinearLayoutManager) rv.getLayoutManager();
                mLastItem = layoutManager.findLastVisibleItemPosition();
                mCount = layoutManager.getItemCount();
                break;
            }
            case 2:
            case 3: {
                StaggeredGridLayoutManager layoutManager = (StaggeredGridLayoutManager) rv.getLayoutManager();
                int[] position = layoutManager.findLastVisibleItemPositions(null);
                //由于是三列所以比对有3个,多列需要多次比对
                mLastItem = Math.max(Math.max(position[0], position[1]), position[2]);
                mCount = layoutManager.getItemCount();
                break;
            }
        }
    }

由于不同布局,所以判断了下,获取最后一个的区别


4.综合全部代码

全部主界面的代码,配合上面的适配器代码就是完整的项目!

MainActivity.java

package com.gjn.recyclerviewdemo;

import android.graphics.Canvas;
import android.graphics.Color;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
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.support.v7.widget.helper.ItemTouchHelper;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.Toast;

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

public class MainActivity extends AppCompatActivity {

    private RecyclerView rv;
    private Button btn_change, btn_add,btn_re;
    private int Type = 0;
    private RecyclerAdapter adapter;
    private int[] imgs = new int[]{R.mipmap.img1, R.mipmap.img2, R.mipmap.img3, R.mipmap.img4,
            R.mipmap.img5};
    private float screenwidth;
    private int mLastItem;
    private int mCount;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initview();
        initdata();

    }

    private void initview() {
        rv = (RecyclerView) findViewById(R.id.rv_list);
        btn_change = (Button) findViewById(R.id.btn_change);
        btn_add = (Button) findViewById(R.id.btn_add);
        btn_re = (Button) findViewById(R.id.btn_re);

        btn_change.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                changeType();
            }
        });

        btn_add.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addItem(1);
            }
        });

        btn_re.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                recycleItem();
            }
        });

        rv.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                //newState:
                //  0   停止滚动
                //  1   正在滚动(用户还在触摸)
                //  2   正在滑动(由于惯性滑动)
                if (newState == RecyclerView.SCROLL_STATE_IDLE
                        && mLastItem + 1 >= mCount) {
                    if (adapter.getItemCount() <= 20) {
                        Toast.makeText(MainActivity.this, "加载新的图片中...", Toast.LENGTH_SHORT).show();
                        for (int i = 0; i < 6; i++) {
                            addItem(adapter.getItemCount());
                        }
                    } else {
                        Toast.makeText(MainActivity.this, "没有了", Toast.LENGTH_SHORT).show();
                    }
                }
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                getLast();
            }
        });
    }

    private void changeType() {
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(MainActivity.this);
        switch (Type) {
            case 0:
                Type = 1;
                mLayoutManager = new GridLayoutManager(MainActivity.this, 2);
                break;
            case 1:
                Type = 2;
                mLayoutManager = new StaggeredGridLayoutManager(3,
                        StaggeredGridLayoutManager.VERTICAL);
                break;
            case 2:
                Type = 3;
                mLayoutManager = new StaggeredGridLayoutManager(3,
                        StaggeredGridLayoutManager.HORIZONTAL);
                break;
            case 3:
                Type = 0;
                mLayoutManager = new LinearLayoutManager(MainActivity.this);
                break;
            default:
                break;
        }
        rv.setLayoutManager(mLayoutManager);
    }

    private void addItem(int x) {
        int i = (int) (Math.random() * 5);
        if (adapter.getItemCount() == 0) {
            adapter.addItem(0,imgs[i]);
        } else {
            adapter.addItem(x,imgs[i]);
        }
    }

    private void recycleItem() {
        for (int i = adapter.getItemCount()-1 ; i >= 0; i--) {
            adapter.removeItem(i);
        }
        for (int j = 0; j < 5; j++) {
            adapter.addItem(j, imgs[j % 5]);
        }
    }

    private void initdata() {
        //初始化recyclerview
        rv.setLayoutManager(new LinearLayoutManager(this));

        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            list.add(i, imgs[i % 5]);
        }
        adapter = new RecyclerAdapter(this, list);

        adapter.setOnClickListener(new RecyclerAdapter.OnItemClickListener() {
            @Override
            public void onClick(int i) {
                Toast.makeText(MainActivity.this, "点击" + i, Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onLongClick(int i) {
                Toast.makeText(MainActivity.this, "长按" + i, Toast.LENGTH_SHORT).show();
            }
        });

        setTouch();

        rv.setAdapter(adapter);
    }

    private void getLast() {
        switch (Type) {
            case 0:
            case 1: {
                LinearLayoutManager layoutManager = (LinearLayoutManager) rv.getLayoutManager();
                mLastItem = layoutManager.findLastVisibleItemPosition();
                mCount = layoutManager.getItemCount();
                break;
            }
            case 2:
            case 3: {
                StaggeredGridLayoutManager layoutManager = (StaggeredGridLayoutManager) rv.getLayoutManager();
                int[] position = layoutManager.findLastVisibleItemPositions(null);
                //由于是三列所以比对有3个,多列需要多次比对
                mLastItem = Math.max(Math.max(position[0], position[1]), position[2]);
                mCount = layoutManager.getItemCount();
                break;
            }
        }
    }

    private void setTouch() {
        WindowManager wm = getWindowManager();
        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);
        screenwidth = dm.widthPixels;

        ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new ItemTouchHelper.Callback() {
            //设置滑动方向
            @Override
            public int getMovementFlags(RecyclerView recyclerView,
                                        RecyclerView.ViewHolder viewHolder) {
                int dragFlags = 0;
                int swipeFlags = 0;
                if (recyclerView.getLayoutManager() instanceof GridLayoutManager
                        || recyclerView.getLayoutManager() instanceof StaggeredGridLayoutManager) {
                    //网格布局  4个方向
                    dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN
                            | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
                } else if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
                    //线性布局  只有上下
                    dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
                    swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
                }
                //swipeFlags为0  item不滑动
                return makeMovementFlags(dragFlags, swipeFlags);
            }

            //长按拖拽
            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
                                  RecyclerView.ViewHolder target) {
                int from = viewHolder.getAdapterPosition();
                int to = target.getAdapterPosition();
                adapter.moveItem(from, to);
                return true;
            }

            //滑动删除
            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
                adapter.removeItem(viewHolder.getAdapterPosition());
            }

            @Override
            public boolean isLongPressDragEnabled() {
                //返回true  表示所有的item都可以拖拽
                return true;
            }

            //当item拖拽开始时调用
            @Override
            public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
                super.onSelectedChanged(viewHolder, actionState);
                if (actionState == ItemTouchHelper.ACTION_STATE_DRAG) {
                    //设置背景灰色
                    viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
                }
            }

            //当item拖拽完成时调用
            @Override
            public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
                super.clearView(recyclerView, viewHolder);
                //设置背景白色
                viewHolder.itemView.setBackgroundColor(Color.WHITE);
            }

            //当item视图变化时调用
            @Override
            public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
                super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
                //根据item滑动偏移的值修改item透明度。screenwidth是屏幕宽度
                viewHolder.itemView.setAlpha(1 - Math.abs(dX) / screenwidth);
            }
        });

        itemTouchHelper.attachToRecyclerView(rv);
    }

}


总结

一个小记录!基本实现了能用的功能。参考了许多

http://www.jianshu.com/p/12ec590f6c76


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值