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