RecyclerView下拉刷新,滑动删除以及拖动变换位置
好久都没有写博客了!前段时间做项目比较忙,在项目中用了RecyclerView替换了listview,感觉还是挺不错的!以下就把学习的过程和写的东西分享给大家:
关于RecyclerView的介绍什么的我就不过多说了,网上有很多这个例子了,具体的方法我是参考了
http://www.cnblogs.com/Fndroid/p/5245250.html
然后根据他的思路把他写的东西实现了下。废话不多说了上传下我的demo,感兴趣的同学可以去下载看看,具体的实现思路就看上边的链接!
代码块
MainAcitivty
public class MainActivity extends AppCompatActivity implements MyAdapter.OnItemButtonCLickListener,SwipeRefreshLayout.OnRefreshListener, OnStartDragListener {
MyAdapter adapter;
SwipeRefreshLayout refreshlayout;//下拉刷新的控件
List<Map<String,String>> list;//数据
private ItemTouchHelper mItemTouchHelper;//滑动
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
View view=getLayoutInflater().inflate(R.layout.activity_main,null);
setContentView(view);
RecyclerView recyclerView=(RecyclerView) findViewById(R.id.recyc);
refreshlayout=(SwipeRefreshLayout) findViewById(R.id.swip);
list=new ArrayList<>();
for (int i=0;i<20;i++){
Map<String,String> map=new HashMap<>();
map.put("title","标题"+i);
map.put("reason","内容"+i);
map.put("date","时间"+i);
list.add(map);
}
adapter=new MyAdapter(list,view);
adapter.setOnItemButtonClickListener(this);
recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
recyclerView.setAdapter(adapter);
refreshlayout.setOnRefreshListener(this);
ItemTouchHelper.Callback callback = new SimpleItemTouchHelperCallback(adapter);
mItemTouchHelper = new ItemTouchHelper(callback);
mItemTouchHelper.attachToRecyclerView(recyclerView);
}
@Override
public void OnItemAlter(int position) {
}
@Override
public void OnItemDelete(int position) {
adapter.notifyItemRemoved(position);
list.remove(position);
}
@Override
public void onRefresh() {
setData();//下拉刷新时获取数据
}
private void setData(){
new Thread() {
@Override
public void run() {
refreshlayout.setRefreshing(true);
try {
Thread.sleep(1000);//休眠1S后去让刷新动画消失
}catch (Exception e){
}
Message message=new Message();
message.what=1;
handler.sendMessage(message);
}
}.start();
}
private Handler handler=new Handler(){
public void handleMessage(Message message){
if (message.what==1){
refreshlayout.setRefreshing(false);//刷新动画消失
}
super.handleMessage(message);
}
};
@Override
public void onStartDrag(RecyclerView.ViewHolder viewHolder) {
mItemTouchHelper.startDrag(viewHolder);
}
}
MyAdapter
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHodle>
implements ItemTouchHelperAdapter {
List<Map<String,String>> data;
OnItemButtonCLickListener listener;
View view;
public MyAdapter(List<Map<String,String>> data,View view){
if (data==null){
this.data=new ArrayList<>();
}else{
this.data=data;
}
this.view=view;
}
@Override
public ViewHodle onCreateViewHolder(ViewGroup parent, int viewType) {
ViewHodle vh = new ViewHodle(LayoutInflater.from(parent.getContext()).inflate(R.layout.main_lv_item, null));
return vh;
}
public void setOnItemButtonClickListener(OnItemButtonCLickListener listener){
this.listener = listener;
}
@Override
public void onBindViewHolder(ViewHodle holder, int position) {
final ViewHodle viewHodle=(ViewHodle)holder;
Map<String,String> map=data.get(position);
viewHodle.title.setText(map.get("title"));
viewHodle.date.setText(map.get("date"));
viewHodle.reason.setText(map.get("reason"));
viewHodle.delete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar snackbar=Snackbar.make(view,"确定删除?",Snackbar.LENGTH_LONG);
snackbar.setAction("确定",new MyOnClickListener(viewHodle.getLayoutPosition())).show();
}
});
}
@Override
public boolean onItemMove(int fromPosition, int toPosition) {
Collections.swap(data, fromPosition, toPosition);
notifyItemMoved(fromPosition, toPosition);
return true;
}
@Override
public void onItemDismiss(int position) {
data.remove(position);
notifyItemRemoved(position);
}
private class MyOnClickListener implements View.OnClickListener {
private final int position;
public MyOnClickListener(int position) {
this.position = position;
}
@Override
public void onClick(View v) {
listener.OnItemDelete(position);
}
}
@Override
public int getItemCount() {
return data.size();
}
class ViewHodle extends RecyclerView.ViewHolder implements
ItemTouchHelperViewHolder
{
TextView title,reason,date,delete;
public ViewHodle(View itemView) {
super(itemView);
title=(TextView)itemView.findViewById(R.id.title);
reason=(TextView)itemView.findViewById(R.id.reason);
date=(TextView)itemView.findViewById(R.id.date);
delete=(TextView)itemView.findViewById(R.id.delete);
}
@Override
public void onItemSelected() {
itemView.setBackgroundColor(Color.LTGRAY);
}
@Override
public void onItemClear() {
itemView.setBackgroundColor(0);
}
}
interface OnItemButtonCLickListener {
void OnItemAlter(int position);
void OnItemDelete(int position);
}
}
SimpleItemTouchHelperCallback
public class SimpleItemTouchHelperCallback extends ItemTouchHelper.Callback {
public static final float ALPHA_FULL = 1.0f;
private final ItemTouchHelperAdapter mAdapter;
public SimpleItemTouchHelperCallback(ItemTouchHelperAdapter adapter) {
mAdapter = adapter;
}
@Override
public boolean isLongPressDragEnabled() {
return true;
}
@Override
public boolean isItemViewSwipeEnabled() {
return true;
}
@Override
public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
// Set movement flags based on the layout manager
if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN | ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
final int swipeFlags = 0;
return makeMovementFlags(dragFlags, swipeFlags);
} else {
final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
final int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
return makeMovementFlags(dragFlags, swipeFlags);
}
}
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder source, RecyclerView.ViewHolder target) {
if (source.getItemViewType() != target.getItemViewType()) {
return false;
}
// Notify the adapter of the move
mAdapter.onItemMove(source.getAdapterPosition(), target.getAdapterPosition());
return true;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int i) {
// Notify the adapter of the dismissal
mAdapter.onItemDismiss(viewHolder.getAdapterPosition());
}
@Override
public void onChildDraw(Canvas c, RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState, boolean isCurrentlyActive) {
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
// Fade out the view as it is swiped out of the parent's bounds
final float alpha = ALPHA_FULL - Math.abs(dX) / (float) viewHolder.itemView.getWidth();
viewHolder.itemView.setAlpha(alpha);
viewHolder.itemView.setTranslationX(dX);
} else {
super.onChildDraw(c, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
}
}
@Override
public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
// We only want the active item to change
if (actionState != ItemTouchHelper.ACTION_STATE_IDLE) {
if (viewHolder instanceof ItemTouchHelperViewHolder) {
// Let the view holder know that this item is being moved or dragged
ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
itemViewHolder.onItemSelected();
}
}
super.onSelectedChanged(viewHolder, actionState);
}
@Override
public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
viewHolder.itemView.setAlpha(ALPHA_FULL);
if (viewHolder instanceof ItemTouchHelperViewHolder) {
// Tell the view holder it's time to restore the idle state
ItemTouchHelperViewHolder itemViewHolder = (ItemTouchHelperViewHolder) viewHolder;
itemViewHolder.onItemClear();
}
}