Skip to content

Commit

Permalink
Update README.md
Browse files Browse the repository at this point in the history
  • Loading branch information
jdsjlzx authored Sep 19, 2016
1 parent efc3e4a commit fc6c367
Showing 1 changed file with 1 addition and 264 deletions.
265 changes: 1 addition & 264 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

LRecyclerView是支持addHeaderView、 addFooterView、下拉刷新、分页加载数据的RecyclerView。

新增功能:SwipeMenu系列功能,包括Item侧滑菜单、长按拖拽Item,滑动删除Item等。

**它对 RecyclerView 控件进行了拓展,给RecyclerView增加HeaderView、FooterView,并且不需要对你的Adapter做任何修改。**

Expand Down Expand Up @@ -287,266 +286,6 @@ public static abstract class ViewHolder {
mRecyclerView.setEmptyView(view);
```

###SwipeMenuAdapter

为了实现SwipeMenu的功能,此次新增了一个[SwipeMenuAdapter](https://github.com/jdsjlzx/LRecyclerView/blob/master/LRecyclerview_library/src/main/java/com/github/jdsjlzx/swipe/SwipeMenuAdapter.java)类。

SwipeMenuAdapter与library中已经存在的LRecyclerViewAdapter会不会冲突呢?答案是不会。SwipeMenuAdapter是用户级别的基类adapter,也就是用户需要继承SwipeMenuAdapter去实现自己的adapter,具体使用同以前。

SwipeMenuAdapter类的定义:
```
public abstract class SwipeMenuAdapter<VH extends RecyclerView.ViewHolder> extends RecyclerView.Adapter<VH>
```

实现自己的MenuAdapter:

```
public class MenuAdapter extends SwipeMenuAdapter<MenuAdapter.DefaultViewHolder> {
protected List<ItemModel> mDataList = new ArrayList<>();
public MenuAdapter() {
}
@Override
public int getItemCount() {
return mDataList.size();
}
@Override
public View onCreateContentView(ViewGroup parent, int viewType) {
return LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_text_swipe, parent, false);
}
@Override
public MenuAdapter.DefaultViewHolder onCompatCreateViewHolder(View realContentView, int viewType) {
return new DefaultViewHolder(realContentView);
}
@Override
public void onBindViewHolder(MenuAdapter.DefaultViewHolder holder, int position) {
String item = mDataList.get(position).title;
DefaultViewHolder viewHolder = holder;
viewHolder.tvTitle.setText(item);
}
static class DefaultViewHolder extends RecyclerView.ViewHolder {
TextView tvTitle;
public DefaultViewHolder(View itemView) {
super(itemView);
tvTitle = (TextView) itemView.findViewById(R.id.tv_title);
}
}
}
```

是不是很方便?MenuAdapter基本的功能都满足了,直接拷贝到项目中即可使用。

###左右两侧都有菜单

效果图:

<img src="https://raw.githubusercontent.com/jdsjlzx/LRecyclerView/master/art/swipe_1.gif" width=320 height=560 />

具体使用步骤如下。

- 为SwipeRecyclerView的Item创建菜单
```
// 设置菜单创建器。
mRecyclerView.setSwipeMenuCreator(swipeMenuCreator);
//设置菜单Item点击监听事件
mRecyclerView.setSwipeMenuItemClickListener(menuItemClickListener);
```

swipeMenuCreator完成了左右菜单的创建,menuItemClickListener实现了菜单的点击事件。

需要注意的是,LRecyclerView提供了下面两个方法,具体使用请详见demo。

```
public void openLeftMenu(int position, int duration) {
openMenu(position, LEFT_DIRECTION, duration);
}
public void openRightMenu(int position) {
openMenu(position, RIGHT_DIRECTION, SwipeMenuLayout.DEFAULT_SCROLLER_DURATION);
}
```
openLeftMenu:打开item的左边菜单
openRightMenu:打开item的右边菜单

这里关键的就是这个position(详细请参考demo)。


###根据ViewType显示菜单

效果图:

<img src="https://raw.githubusercontent.com/jdsjlzx/LRecyclerView/master/art/swipe_2.gif" width=320 height=560 />

根据ViewType决定SwipeMenu在哪一行出现,可以左侧,可以右侧。

自定义MenuViewTypeAdapter,代码如下:
```
public class MenuViewTypeAdapter extends MenuAdapter {
public static final int VIEW_TYPE_MENU = 1;
public static final int VIEW_TYPE_NONE = 2;
@Override
public int getItemViewType(int position) {
return position % 2 == 0 ? VIEW_TYPE_MENU : VIEW_TYPE_NONE;
}
}
```

在实现swipeMenuCreator 时,需要根据ItemViewType值来决定是否创建左右菜单。

```
private SwipeMenuCreator swipeMenuCreator = new SwipeMenuCreator() {
@Override
public void onCreateMenu(SwipeMenu swipeLeftMenu, SwipeMenu swipeRightMenu, int viewType) {
// 根据Adapter的ViewType来决定菜单的样式、颜色等属性、或者是否添加菜单。
if (viewType == MenuViewTypeAdapter.VIEW_TYPE_NONE) {
// Do nothing.
} else if (viewType == MenuViewTypeAdapter.VIEW_TYPE_MENU) {
int size = getResources().getDimensionPixelSize(R.dimen.item_height);
......
}
}
};
```

###长按拖拽Item(List),与菜单结合

效果图:

<img src="https://raw.githubusercontent.com/jdsjlzx/LRecyclerView/master/art/swipe_3.gif" width=320 height=560 />

关键代码:
```
mRecyclerView.setLongPressDragEnabled(true);// 开启拖拽功能
mRecyclerView.setOnItemMoveListener(onItemMoveListener);// 监听拖拽,更新UI。
```

onItemMoveListener具体如下:
```
/**
* 当Item移动的时候。
*/
private OnItemMoveListener onItemMoveListener = new OnItemMoveListener() {
@Override
public boolean onItemMove(int fromPosition, int toPosition) {
final int adjFromPosition = mLRecyclerViewAdapter.getAdapterPosition(true, fromPosition);
final int adjToPosition = mLRecyclerViewAdapter.getAdapterPosition(true, toPosition);
// 当Item被拖拽的时候。
Collections.swap(mDataAdapter.getDataList(), adjFromPosition, adjToPosition);
//Be carefull in here!
mLRecyclerViewAdapter.notifyItemMoved(fromPosition, toPosition);
return true;// 返回true表示处理了,返回false表示你没有处理。
}
@Override
public void onItemDismiss(int position) {
// 当Item被滑动删除掉的时候,在这里是无效的,因为这里没有启用这个功能。
// 使用Menu时就不用使用这个侧滑删除啦,两个是冲突的。
}
};
```

注意下面代码:

```
final int adjFromPosition = mLRecyclerViewAdapter.getAdapterPosition(true, fromPosition);
final int adjToPosition = mLRecyclerViewAdapter.getAdapterPosition(true, toPosition);
```

<font color="red">关于position的位置,为了大家使用方便,特在LRecyclerViewAdapter中提供了一个方法getAdapterPosition(boolean isCallback, int position)。</font>
>
>- isCallback 含义:position是否接口回调中带来的
> - position 含义:如果不是接口回调,就是用户自己指定的position
> - getAdapterPosition(boolean isCallback, int position)只用于非LRecyclerViewAdapter提供的接口。
举例说明:

- setOnItemMoveListener不是 LRecyclerViewAdapter自带接口(也就是内部方法),需要调用getAdapterPosition方法获得正确的position
- 如setOnItemClickLitener 是 LRecyclerViewAdapter自带接口,接口里面自带了position,用户就不必调用getAdapterPosition方法,直接使用就可以了。
```
mLRecyclerViewAdapter.setOnItemClickLitener(new OnItemClickLitener() {
@Override
public void onItemClick(View view, int position) {
String text = "Click position = " + position;
}
@Override
public void onItemLongClick(View view, int position) {
}
});
```

###长按拖拽Item(Grid)

效果图:

<img src="https://raw.githubusercontent.com/jdsjlzx/LRecyclerView/master/art/swipe_4.gif" width=320 height=560 />

与list功能一样,只是布局不一样。

###滑动直接删除Item

效果图:

<img src="https://raw.githubusercontent.com/jdsjlzx/LRecyclerView/master/art/swipe_5.gif" width=320 height=560 />

注意:
> 滑动删除和滑动菜单是互相冲突的,两者只能出现一个。
关键代码:

```
mRecyclerView.setLongPressDragEnabled(true);
mRecyclerView.setItemViewSwipeEnabled(true);// 开启滑动删除
mRecyclerView.setOnItemMoveListener(onItemMoveListener);// 监听拖拽,更新UI
```

按照配置就可以实现滑动删除。

###指定某个Item不能拖拽或者不能滑动删除

效果图:

<img src="https://raw.githubusercontent.com/jdsjlzx/LRecyclerView/master/art/swipe_6.gif" width=320 height=560 />

关键代码:

```
mRecyclerView.setLongPressDragEnabled(true);
mRecyclerView.setItemViewSwipeEnabled(true);// 开启滑动删除。
mRecyclerView.setOnItemMoveListener(onItemMoveListener);// 监听拖拽,更新UI。 mRecyclerView.setOnItemMovementListener(onItemMovementListener);
```

###用SwipeMenuLayout实现你自己的侧滑

效果图:

<img src="https://raw.githubusercontent.com/jdsjlzx/LRecyclerView/master/art/swipe_7.gif" width=320 height=560 />

这个与LRecyclerView关系不大,但是与SwipeMenu关系密切。为了实现滑动菜单的功能,定义了SwipeMenuLayout,详细使用见demo。


##分组

Expand Down Expand Up @@ -577,14 +316,12 @@ mRecyclerView.setLScrollListener(LScrollListener);
RecyclerViewUtils.setFooterView(mRecyclerView, new SampleFooter(this));
```
2.不要SwipeRefreshLayout与LRecyclerView一起使用,会有冲突
2.不要SwipeRefreshLayout与LRecyclerView一起使用,会有冲突,如果你实在想用,请参考

##Thanks

1.[HeaderAndFooterRecyclerView](https://github.com/cundong/HeaderAndFooterRecyclerView)

2.[SwipeRecyclerView](https://github.com/yanzhenjie/SwipeRecyclerView)


##打赏

Expand Down

0 comments on commit fc6c367

Please sign in to comment.