A ascension development efficiency for RecyclerView,you can see details in README.
For more information please see RecyclerView总结与多功能便捷Adapter的封装
Add this in your root build.gradle file (not your module build.gradle file):
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
Then, add the library to your module build.gradle
dependencies {
compile 'com.github.NessCurie:RecyclerViewUtils:latest.release.here'
}
such as release is v1.0
you can use:
dependencies {
compile 'com.github.NessCurie:RecyclerViewUtils:v1.0'
}
创建SimpleAdapter对象,设置给RecyclerView即可:
/**
* 创建简单的recyclerView适配器
*
* @param context 上下文
* @param id item的layout的id
* @param list 集合
*/
public SimpleAdapter(final Context context, final int id, List
list)
比如:
SimpleAdapter simpleAdapter = new SimpleAdapter
(this, R.layout.item_simple, list) {
@Override
public void setItemData(final MViewHolder holder, String s, int position) {
holder.setText(R.id.tv_center, s);
}
};
可以重写其中的
onViewHolderCreated()
方法在创建完ViewHolder后做一些操作;可以重写其中的
isClickEnabled()
设置哪些type不可点击.
在getLayoutId()
返回对应itemType的布局的id
在isThisTypeItem()
提供判断是否是对应itemType的方法.
在setData()
对item中对应id的控件设置对应数据.可以使用MViewHolder中提供的一系列方法进行链式调用
比如:集合中存的为String类型,分别有数字和其他字符类型,将数字类型显示为一种item,其他字符显示为一种item.
adapter = new BaseAdapter
(this, list) {
@Override
public boolean isClickEnabled(int viewType) { //这里将数字type不可点击
return viewType != 1;
}
};
adapter.addType(new IType () {
@Override
public int getLayoutId() {
return R.layout.item_type1;
}
@Override
public boolean isThisTypeItem(String item, int position) {//不是数字的使用该type,是灰色背景
try {
Integer.parseInt(item);
return false;
} catch (NumberFormatException e) {
return true;
}
}
@Override
public void setData(MViewHolder holder, String s, int position) {
holder.setText(R.id.tv_center, s)
.setDragListener(R.id.iv_hand);
}
});
adapter.addType(new IType () {
@Override
public int getLayoutId() {
return R.layout.item_type2;
}
@Override
public boolean isThisTypeItem(String item, int position) { //是数字的使用该type,是红色背景
try {
Integer.parseInt(item);
return true;
} catch (NumberFormatException e) {
return false;
}
}
@Override
public void setData(MViewHolder holder, String s, int position) {
holder.setText(R.id.tv_center, s);
}
});
/**
* 使用系统默认分割线作为recyclerView的分割线
*/
public SimpleDecoration(Context context)
/**
* 使用指定Drawable作为recyclerView的分割线
*/
public SimpleDecoration(Context context, Drawable drawable)
/**
* 使用指定Drawable的id作为recyclerView的分割线
*/
public SimpleDecoration(Context context, int drawID)
/**
* 根据参数开启recycler的侧拉删除和长按拖动
*
* @param recyclerView adapter的RecyclerView的对象
* @param openLongPressDrag 是否开启长按拖动
* @param openSwipeDelete 是否开启侧滑删除
* @param refreshLayout 因为在最顶部和最底部时拖动会和下拉刷新以及加载更多冲突,所以当有
* 添加{@link SwipyRefreshLayout}的时候需要和下拉刷新的控件关联,
* 如果没有添加下拉刷新和上拉的传null即可
*/
public void openItemTouch(RecyclerView recyclerView, boolean openLongPressDrag,
boolean openSwipeDelete, SwipyRefreshLayout refreshLayout)
比如:
simpleAdapter.openItemTouch(recyclerview, true, true, swipyrefreshlayout);
在SimpleAdapter的setItemData()
方法或IType实现类的setData()
方法中,使用holder调用setDragListener(int id)
即可,需要adapter调用上面的openItemTouch()
方法,否则不会生效.
比如:holder.setDragListener(R.id.iv_hand);
点击和长按事件封装在BaseAdapter中,如果同时设置了长按拖动和长按点击事件,会同时触发.
adapter.setOnItemLongClickListener(this);
adapter.setOnItemClickListener(this);
@Override
public boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, int position) {
return false;
}
@Override
public void onItemClick(View view, RecyclerView.ViewHolder holder, int position) {
}
在布局文件中使用com.github.recyclerviewutils.SwipyRefreshLayout
节点包裹RecyclerView,在xml中设置对应的refresh_mode
或在代码中使用setRefreshMode(int)
设置.
可以使用setColorSchemeResources()设置刷新控件中间的进度条的颜色,支持多个颜色,会依次出现
swipyrefreshlayout.setColorSchemeResources(android.R.color.holo_blue_bright,
android.R.color.holo_green_light, android.R.color.holo_orange_light,
android.R.color.holo_red_light);
可以使用setProgressBackgroundColor()设置刷新控件的背景.
swipyrefreshlayout.setProgressBackgroundColor(android.R.color.darker_gray);
设置刷新监听的回调,根据传来的参数判断是下拉刷新还是上拉加载更多
swipyrefreshlayout.setOnRefreshListener(this);
@Override
public void onRefresh(int direction) {
switch (direction) {
case SwipyRefreshLayout.TOP:
break;
case SwipyRefreshLayout.BOTTOM:
break;
}
}
刷新完毕后调用swipyrefreshlayout.setRefreshing(false);
隐藏刷新控件