item的左滑删除和拖动换位

2019-03-20  本文已影响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();
    }
}

上一篇下一篇

猜你喜欢

热点阅读