RecyclerView下拉刷新,滑动删除以及拖动变换位置

本文分享了一个基于 RecyclerView 的项目实战经验,包括如何实现下拉刷新、滑动删除和拖动改变位置等功能。通过提供的代码示例,读者可以快速掌握这些实用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();
        }
    }

具体的代码:
http://download.youkuaiyun.com/detail/qklnmc/9695756

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值