Android使用ItemTouchHelper实现RecyclerView的item拖动位置交换

1.导入依赖

 compile 'com.android.support:recyclerview-v7:23.+'

2.适配器

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.TextView;

public class NormalRecyclerViewAdapter extends RecyclerView.Adapter<NormalRecyclerViewAdapter.NormalTextViewHolder>{

    private final LayoutInflater mLayoutInflater;
    private final Context mContext;
    private String[] mTitles;

    public NormalRecyclerViewAdapter(Context context) {
        mTitles = context.getResources().getStringArray(R.array.titles);
        mContext = context;
        mLayoutInflater = LayoutInflater.from(context);
    }

    @Override
    public NormalTextViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new NormalTextViewHolder(mLayoutInflater.inflate(R.layout.item_text, parent, false));
    }

    @Override
    public void onBindViewHolder(NormalTextViewHolder holder, int position) {
        holder.mTextView.setText(mTitles[position]);
    }

    @Override
    public int getItemCount() {
        return mTitles == null ? 0 : mTitles.length;
    }

    public static class NormalTextViewHolder extends RecyclerView.ViewHolder {
        private
        TextView mTextView;


        NormalTextViewHolder(View view) {
            super(view);
            mTextView=(TextView)view.findViewById(R.id.tv_name);
        }
    }
}
  1. item_text.xml 里面写了一个TextView
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="10dp"
        />

</LinearLayout>

4.activtity.xml

<?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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.ebeijia.recyclerview1.MainActivity">


    <android.support.v7.widget.RecyclerView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/recycler_view"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true"/>

</RelativeLayout>

5.在values文件夹下新建一个array.xml文件,用于存放数组资源

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="titles">
        <item>啦啦啦啦</item>
        <item>哈哈哈</item>
        <item>你是谁</item>
        <item>怎么会这样</item>
        <item>这可如何是好?</item>
        <item>111</item>
        <item>222</item>
        <item>333</item>
        <item>444</item>
        <item>555</item>
        <item>666</item>
    </string-array>
</resources>

6.实现

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.helper.ItemTouchHelper;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    private RecyclerView mRecyclerView;
    private ItemTouchHelper itemTouchHelper;
    private int dragFlags,swipeFlags;
    private List<String> mDatas=new ArrayList<>();
    private NormalRecyclerViewAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mRecyclerView=(RecyclerView)findViewById(R.id.recycler_view);
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));//这里用线性显示 类似于listview
        adapter=new NormalRecyclerViewAdapter(this);
        mRecyclerView.setAdapter(adapter);
        String str[]=getResources().getStringArray(R.array.titles);
        for(int i=0;i<str.length;i++)
        {
            mDatas.add(str[i]);
        }

        itemTouchHelper=new ItemTouchHelper(new ItemTouchHelper.Callback() {
            @Override
            public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {

                if(mRecyclerView.getLayoutManager() instanceof GridLayoutManager)
                {
                    dragFlags=ItemTouchHelper.UP |
                                ItemTouchHelper.DOWN |
                                ItemTouchHelper.LEFT |
                                ItemTouchHelper.RIGHT;
                    swipeFlags=0;

                    return makeMovementFlags(dragFlags,swipeFlags);
                }else
                {
                    dragFlags=ItemTouchHelper.UP |
                            ItemTouchHelper.DOWN;
                    swipeFlags=0;
                    return makeMovementFlags(dragFlags,swipeFlags);
                }


                //return makeMovementFlags(dragFlags,swipeFlags);
        }

            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {

                int fromPosition=viewHolder.getAdapterPosition();
                int toPosition=target.getAdapterPosition();
                if(fromPosition<toPosition)
                {
                    for(int i=fromPosition;i<toPosition;i++)
                    {
                        Collections.swap(mDatas,i,i+1);
                    }
                }else
                {
                    for(int i=fromPosition;i>toPosition;i--)
                    {
                        Collections.swap(mDatas,i,i-1);
                    }
                }
                adapter.notifyItemMoved(fromPosition,toPosition);
                return true;
            }

            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
            }

            @Override
            public void onSelectedChanged(RecyclerView.ViewHolder viewHolder, int actionState) {
                if(actionState!=ItemTouchHelper.ACTION_STATE_IDLE)
                {
                    viewHolder.itemView.setBackgroundColor(Color.LTGRAY);
                }
                super.onSelectedChanged(viewHolder, actionState);
            }

            @Override
            public void clearView(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
                super.clearView(recyclerView, viewHolder);
                viewHolder.itemView.setBackgroundColor(0);
            }

            @Override
            public boolean isLongPressDragEnabled() {
                //return super.isLongPressDragEnabled();
                return true;
            }
        });
        itemTouchHelper.attachToRecyclerView(mRecyclerView);
    }
}

6.实现效果
这里写图片描述
这边用RecyclerView实现了ListView拖拽item的效果。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
RecyclerViewItemTouchHelper是一个强大的辅助工具类,用于处理RecyclerViewItem的触摸操作和拖拽操作。如果想要让部分Item位置固定,可以通过以下步骤实现: 1. 首先,创建一个自定义的ItemTouchHelper.Callback类,继承自ItemTouchHelper.Callback。在该类中重写以下几个方法: - getMovementFlags()方法:返回Item的拖拽和滑动方向,可以根据具体需求对各个Item设置不同的拖拽和滑动方向。 - onMove()方法:处理Item的拖拽操作,可以在此方法中完成Item位置交换。在交换时,需要判断被拖拽的Item是否是固定位置Item,如果是,则不进行交换操作。 - onSwiped()方法:处理Item的滑动操作,可以在此方法中完成Item的滑动删除操作。同样在滑动删除时,需要判断被滑动的Item是否是固定位置Item,如果是,则不进行删除操作。 2. 在RecyclerView的Adapter中,重写以下几个方法: - onBindViewHolder()方法:在该方法中为每个Item添加触摸事件的监听器,只有非固定位置Item才可以进行触摸操作。 3. 在MainActivity或其他适当的地方,创建ItemTouchHelper对象,并将自定义的ItemTouchHelper.Callback类传入。 - ItemTouchHelper itemTouchHelper = new ItemTouchHelper(new CustomItemTouchHelperCallback()); 4. 将ItemTouchHelper对象与RecyclerView进行绑定。 - itemTouchHelper.attachToRecyclerView(recyclerView); 通过以上步骤的实现,可以实现RecyclerView中部分Item固定位置的效果。在进行拖拽或滑动操作时,会自动跳过固定位置Item,并保持其固定位置不变。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值