美文网首页
item的左滑删除和拖动换位

item的左滑删除和拖动换位

作者: 君袅 | 来源:发表于2019-03-20 22:32 被阅读0次
    image.png
    image.png

    如图所示:实际上在我们开发过程中经常会遇到这样的需求,在图1中点击小三角后跳转到图2,然后选中,图一
    中就只显示你开启的页面吧,就是让tablayout中显示的是你选中的内容,而且可以切换位置,左滑删除
    我的基本思路就是刚开始让图一中是存在着所有的内容,然后通过传值吧,图一的集合给图二,图二中将改变状态的集合在回传给图一,然后图一,修改成值选中的内容

    代码:
    1.现有一个实体类(维护状态)

    public class ItemBean implements Serializable{
        public String name;
        public boolean isSelected;
    
        public ItemBean(String name, boolean isSelected) {
            this.name = name;
            this.isSelected = isSelected;
        }
    
        @Override
        public String toString() {
            return "ItemBean{" +
                    "name='" + name + '\'' +
                    ", isSelected=" + isSelected +
                    '}';
        }
    }
    

    2.页面一中

    public class XiTu_Fragment extends BaseFragment<XiTuPresenter,XiTuView> implements XiTuView {
    
    
        @BindView(R.id.img)
        ImageView img;
        @BindView(R.id.tab)
        TabLayout tab;
        @BindView(R.id.vp)
        ViewPager vp;
    
        private String[] mTypes = new String[]{"iOS","工具资源","阅读","产品","Android",
                "前段","设计","后端"};
        private ArrayList<ItemBean> mItemBeans;
        private ArrayList<Fragment> list;
        private ArrayList<String> Title;
        private String TAG="XiTu_Fragment";
    
        @Override
        protected XiTuPresenter initPresenter() {
            return new XiTuPresenter();
        }
    
        @Override
        protected int getLayoutID() {
            return R.layout.fragment_xi_tu_;
        }
    
        @Override
        protected void initView(View view) {
            super.initView(view);
            initFragments();
            setVp();
    
        }
    
        private void setVp() {
            AdapterVp adapterVp = new AdapterVp(getChildFragmentManager(), Title, list);
            vp.setAdapter(adapterVp);
            tab.setupWithViewPager(vp);
        }
    
        @Override
        protected void initData() {
            super.initData();
        }
    
        private void initFragments() {
            mItemBeans = new ArrayList<>();
            list = new ArrayList<>();
            Title= new ArrayList<>();
            for (int i = 0; i < mTypes.length; i++) {
                ItemBean itemBean = new ItemBean(mTypes[i], true);//完善实体类,显示所有的内容,状态全都是true
                mItemBeans.add(itemBean);
            }
    
            addFragments(mItemBeans);
    
      //img就是三角形,通过他的点击事件,把原来的集合传给图2
            img.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(getContext(), XiTuActivity.class);
                    if(drta==null){
                        drta = mItemBeans;
                    }
                    intent.putExtra("data",drta);
                    startActivityForResult(intent,1);
                }
            });
    
        }
    //    ItemBean是维护状态和标题的类
        private void addFragments(ArrayList<ItemBean> data) {
            list.clear();   //将原来(添加fragment的集合)都清空 ViewPager加载
            Title.clear();  //原来的tablayout的集合
            for (int i = 0; i < data.size(); i++) {
                ItemBean itemBean1 = data.get(i);
                if(itemBean1.isSelected){ // 未经选择的
                    this.list.add(Fragment_xi.newInstance(itemBean1.name));//实现对fragment的复用
                    Title.add(itemBean1.name);//最新的标题
                }
            }
        }
    
        //通过回传重现修改tablayout的内容个ViewPager
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            if(requestCode==1&&resultCode==2){
                ArrayList<ItemBean> data1 = (ArrayList<ItemBean>) data.getSerializableExtra("data");
                    addFragments(data1);//修改内容的方法
                    setVp();   //掉用适配器的方法
                    Log.e(TAG, "onActivityResult: "+data1);
            }
            super.onActivityResult(requestCode, resultCode, data);
        }
    }
    
    

    2.在二个页面里

    public class XiTuActivity extends AppCompatActivity {
    
        private static final String TAG = "shu";
        private RecyclerView mRe;
        private ArrayList<ItemBean> mData;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_xi_tu);
            initView();
        }
    
        private void initView() {
            Intent intent = getIntent();
            mData = (ArrayList<ItemBean>) intent.getSerializableExtra("data");//将在页面一中传来的集合
    
            mRe = (RecyclerView) findViewById(R.id.re);
    
    
            RlvGoldShowAdapter adapter = new RlvGoldShowAdapter(this, mData);//绑定适配器
            mRe.setAdapter(adapter);
            mRe.setLayoutManager(new LinearLayoutManager(this));
    
            mRe.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.VERTICAL));
    
    
            SimpleItemTouchHelper helper = new SimpleItemTouchHelper(adapter);//
            ItemTouchHelper itemTouchHelper = new ItemTouchHelper(helper);
            itemTouchHelper.attachToRecyclerView(mRe);
    
    
            adapter.setmListener(new RlvGoldShowAdapter.OnItemClickListener() {
                @Override
                public void OnItemClick(View v, int position) {
                    ToastUtil.showShort("xixi");
                }
            });
        }
    
        @Override
        public void onBackPressed() {
            Intent intent = new Intent();
            intent.putExtra("data",mData);
            setResult(2,intent);
            super.onBackPressed();
        }
    }
    
    

    3.定义接口

    public interface TouchCallBack {
        //数据交换
        void onItemMove(int fromPosition, int toPosition);
    
        //数据删除
        void onItemDelete(int position);
    }
    

    4.适配器(也得实现3的接口)

    public class RlvGoldShowAdapter extends RecyclerView.Adapter<RlvGoldShowAdapter.MayDay> implements TouchCallBack{
    
    
        private final Context context;
        private final ArrayList<ItemBean> mData;
    
        public RlvGoldShowAdapter(Context context, ArrayList<ItemBean> mData) {
    
            this.context = context;
            this.mData = mData;
        }
    
        @NonNull
        @Override
        public MayDay onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View inflate = LayoutInflater.from(context).inflate(R.layout.zhanshi, null);
            return new MayDay(inflate);
        }
    
        @Override
        public void onBindViewHolder(@NonNull MayDay holder, final int position) {
    
            MayDay mayDay=(MayDay)holder;
            final ItemBean bean = mData.get(position);
    
            mayDay.name.setText(bean.name);
            mayDay.sc.setChecked(bean.isSelected);
    
    
            mayDay.sc.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    bean.isSelected = isChecked;
                }
            });
    
            mayDay.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mListener.OnItemClick(v,position);
                }
            });
    
    
        }
    
        @Override
        public int getItemCount() {
            return mData.size();
        }
    
        @Override
        public void onItemMove(int fromPosition, int toPosition) {
            //数据交换
            //交换集合的数据位置
            Collections.swap(mData,fromPosition,toPosition);
            //刷新适配器(局部刷新,移动)
            notifyItemMoved(fromPosition,toPosition);
        }
    
        @Override
        public void onItemDelete(int position) {
            //数据删除
            mData.remove(position);
            //局部刷新(删除)
            notifyItemRemoved(position);
        }
    
        public class MayDay extends RecyclerView.ViewHolder {
            private TextView name;
            private SwitchCompat sc;
    
            public MayDay(View itemView) {
                super(itemView);
                name=itemView.findViewById(R.id.name);
                sc=itemView.findViewById(R.id.sc);
            }
        }
    
    
        public OnItemClickListener mListener;
    
        public void setmListener(OnItemClickListener mListener) {
            this.mListener = mListener;
        }
    
        public interface OnItemClickListener{
            void OnItemClick(View v, int position);
        }
    }
    

    5.适配器里引用的xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="140dp">
    
    
        <TextView
            android:id="@+id/name"
            android:layout_marginLeft="20dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="30sp"
            android:text="asdasd"
            android:drawableLeft="@mipmap/ic_drag"
            android:drawablePadding="10dp"
            android:layout_centerVertical="true"
            />
    
        <android.support.v7.widget.SwitchCompat
            android:id="@+id/sc"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_marginRight="20dp"
            android:layout_centerVertical="true"
            />
    
    
    </RelativeLayout>
    

    整体思路 : 是通过一个接口 ,在SimpleItemTouchHelper和适配器里实现,而SimpleItemTouchHelper中能够获取到我(上下拖动item,或者左右滑动时)的位置 然后在适配器里,获取到位置进行处理
    有实现类

    /**
     * Created by asus on 2019/3/20.
     */
    
    public class SimpleItemTouchHelper extends ItemTouchHelper.Callback {
    
        private TouchCallBack mCallBack;
    
        public SimpleItemTouchHelper(TouchCallBack callBack) {
    
            mCallBack = callBack;
        }
    
        /**
         * 返回可以滑动的方向,一般使用makeMovementFlags(int,int)或makeFlag(int, int)
         * 来构造我们的返回值
         * @param recyclerView
         * @param viewHolder
         * @return
         */
        @Override
        public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
            //允许上下拖拽
            int drag = ItemTouchHelper.UP  | ItemTouchHelper.DOWN;
            //允许向左滑动
            int swipe = ItemTouchHelper.LEFT;
            return makeMovementFlags(drag,swipe);
        }
    
        /**
         *  上下拖动item时回调,可以调用Adapter的notifyItemMoved方法来交换两个ViewHolder的位置,
         *  最后返回true,表示被拖动的ViewHolder已经移动到了目的位置,
         * @param recyclerView
         * @param viewHolder
         * @param target
         * @return
         */
        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder,
                              RecyclerView.ViewHolder target) {
            mCallBack.onItemMove(viewHolder.getAdapterPosition(),target.getAdapterPosition());
            return true;
        }
    
        /**
         * 当用户左右滑动item时达到删除条件就会调用,
         * 一般为一半,条目继续滑动删除,否则弹回
         * @param viewHolder
         * @param direction
         */
        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
            mCallBack.onItemDelete(viewHolder.getAdapterPosition());  //删除条目,并局部刷新
        }
    
        /**
         * 支持长按拖动,默认true
         * @return
         */
        @Override
        public boolean isLongPressDragEnabled() {
            return super.isLongPressDragEnabled();
        }
    
        /**
         *  支持滑动,默认true
         * @return
         */
        @Override
        public boolean isItemViewSwipeEnabled() {
            return super.isItemViewSwipeEnabled();
        }
    }
    
    

    相关文章

      网友评论

          本文标题:item的左滑删除和拖动换位

          本文链接:https://www.haomeiwen.com/subject/pilxvqtx.html