package com.bigfat.listviewdragdemo; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.DragEvent; import android.view.View; import android.view.ViewGroup; import android.widget.ScrollView; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { private static final String TAG = MainActivity.class.getSimpleName(); // private MyHorizontalScrollView scrollView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.item_section_scroll_view); // scrollView = (MyHorizontalScrollView) findViewById(R.id.scrollView); // scrollView.setOnPageSelectListener(new MyHorizontalScrollView.OnPageSelectListener() { // @Override // public void onPageSelect(int currentPage) { // // } // }); // scrollView.setData(generateData()); ScrollView scrollView = (ScrollView) findViewById(R.id.sv_item_section); SectionListLayout layout = new SectionListLayout(this); layout.setData(generateStringList("", 40)); scrollView.addView(layout); for(int i = 0;i < layout.getChildCount();i++){ setupDragSort(layout.getChildAt(i), layout); } } private ArrayList<Section> generateData() { ArrayList<Section> data = new ArrayList<>(); data.add(new Section("阶段1", generateStringList("1-", 20))); data.add(new Section("阶段2", generateStringList("2-", 10))); data.add(new Section("阶段3", generateStringList("3-", 35))); data.add(new Section("阶段4", generateStringList("4-", 50))); return data; } private ArrayList<String> generateStringList(String title, int size) { ArrayList<String> data = new ArrayList<>(); for (int i = 0; i < size; i++) { data.add(title + i); } return data; } private static android.os.Handler handler = new android.os.Handler(); private static Runnable runnable; public static void setupDragSort( View view, final SectionListLayout layout) { view.setOnDragListener(new View.OnDragListener() { @Override public boolean onDrag(final View view, final DragEvent event) { final ViewGroup viewGroup = (ViewGroup) view.getParent(); final DragUtils.DragState dragState = (DragUtils.DragState) event.getLocalState(); switch (event.getAction()) { case DragEvent.ACTION_DRAG_STARTED: if (view == dragState.view) { dragState.view.setVisibility(View.INVISIBLE); } if (runnable != null) { handler.removeCallbacks(runnable); runnable = null; } return true; case DragEvent.ACTION_DRAG_LOCATION: if (view != dragState.view) { final int position = layout.indexOfChild(view); //拖拽到达列表边界时,令ScrollView滚动 ScrollView svSection = (ScrollView) viewGroup.getParent(); if ((position + 2) * view.getHeight() > svSection.getHeight() + svSection.getScrollY()) { svSection.smoothScrollBy(0, view.getHeight()); } else if (position * view.getHeight() < svSection.getScrollY()) { svSection.smoothScrollBy(0, -view.getHeight()); } //处理View拖拽交换 if (runnable != null) { handler.removeCallbacks(runnable); runnable = null; } runnable = new Runnable() { @Override public void run() { swipeViews(dragState, (SectionListLayout) viewGroup, position); } }; handler.postDelayed(runnable, DragUtils.itemExchangeDelay); } break; case DragEvent.ACTION_DRAG_ENDED: Log.i(TAG, "ACTION_DRAG_ENDED"); if (runnable != null) { handler.removeCallbacks(runnable); runnable = null; } handler.post(new Runnable() { @Override public void run() { dragState.view.setVisibility(View.VISIBLE); } }); break; } return true; } }); view.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View view) { view.startDrag(null, new View.DragShadowBuilder(view), new DragUtils.DragState(view, DragUtils.DragViewType.TASK, layout.indexOfChild(view)), 0); return true; } }); } private static void swipeViews(DragUtils.DragState dragState, SectionListLayout layoutInserted, int insertPosition) { SectionListLayout layoutRemoved = (SectionListLayout) dragState.view.getParent(); String text =layoutRemoved.getData().get(dragState.position); layoutRemoved.getData().remove(dragState.position); layoutRemoved.notifyDataRemoved(dragState.position); layoutInserted.getData().add(insertPosition, text); dragState.view = layoutInserted.notifyDataInserted(insertPosition); layoutRemoved.setDragPosition(-1); layoutInserted.setDragPosition(insertPosition); layoutInserted.refreshVisibility(); dragState.position = insertPosition; } }