如何拖放放置的位置并从android

时间:2018-01-17 03:36:34

标签: android

MainActvity.java

public class MainActivity extends AppCompatActivity implements View.OnDragListener {
    private ListView mListView;
    private LinearLayout mFrameLayout;
    private List<ItemModel> mList = new ArrayList<>();
    private DraggingAdapter mDraggingAdapter;

    View.OnLongClickListener dragListener = new View.OnLongClickListener() {

        @Override
        public boolean onLongClick(View view) {
            ClipData data = ClipData.newPlainText("", "");
            View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
            view.startDrag(data, shadowBuilder, view, 0);
            return true;
        }
    };

    View.OnTouchListener touchListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent event) {
            Log.e("TouchListener Up", "X: " + view.getX() + ", Y: " + view.getY());
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                Log.e("TouchListener Down", "X: " + view.getX() + ", Y: " + view.getY());
                return true;
            } else if (event.getAction() == MotionEvent.ACTION_UP) {
                return true;
            }
            return false;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mListView = findViewById(R.id.listview);
        mFrameLayout = findViewById(R.id.framelayout);
        mDraggingAdapter = new DraggingAdapter(touchListener);
        for (int i = 1; i <= 20; i++) {
            mList.add(new ItemModel(false, i));
        }
        //mListView.setOnDragListener(this);
        mFrameLayout.setOnDragListener(this);
        mListView.setAdapter(mDraggingAdapter);
        mDraggingAdapter.setData(mList);
    }

    @Override
    public boolean onDrag(View v, DragEvent event) {
        switch (event.getAction()) {
            case DragEvent.ACTION_DRAG_STARTED:
                // Do nothing
                Log.e("onDrag", "DragEvent.Action_drag_started");
                break;
            case DragEvent.ACTION_DRAG_ENTERED:
                //v.setBackground(enterShape);
                Log.e("onDrag", "DragEvent.Action_drag_entered");
                break;
            case DragEvent.ACTION_DRAG_EXITED:
                //v.setBackground(normalShape);
                Log.e("onDrag", "DragEvent.Action_drag_Exited");
                break;
            case DragEvent.ACTION_DRAG_LOCATION:
                //Log.e("onDrag Location", "X: " + v.getX() + ", Y: " + v.getY());
                break;
            case DragEvent.ACTION_DROP:
                Log.e("onDrag", "DragEvent.Action_drag_dropped");
                // view dropped, reassign the view to the new ViewGroup
                float xCoordinates = v.getX();
                float yCoordinates = v.getY();

                View view = (View) event.getLocalState();
                Log.e("ACTION_DROP", "X: " + view.getX() + ", Y: " + view.getY());
                ItemModel model = (ItemModel) view.getTag();
                //DraggingAdapter owner = (DraggingAdapter) view.getParent();
                //mList.remove((int) view.getTag());
                LinearLayout container = (LinearLayout) v;
                View viewCloning = LayoutInflater.from(MainActivity.this).inflate(R.layout
                        .item_view, null);
                //viewCloning.setX(xCoordinates-(viewCloning.getWidth()/2));
                //viewCloning.setY(yCoordinates-(viewCloning.getHeight()/2));

                ((AppCompatTextView) viewCloning.findViewById(R.id.textview)).setText("Textview " +
                        model.itemText);
                if (!model.isDragged) {
                    model.isDragged = true;
                    mDraggingAdapter.notifyDataSetChanged();
                    viewCloning.setBackgroundResource(R.drawable.grey_background);
                    Log.e("Cloned View", "" + viewCloning.getWidth() + " " + viewCloning.getHeight());
                    int width = new Random().nextInt((container.getWidth() - viewCloning.getWidth()));
                    int height = new Random().nextInt((container.getHeight() - viewCloning
                            .getHeight()));
                    Log.e("Params Values: ", "Width: " + width + "  Height: " + height);
                    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(view.getWidth(),
                            view.getHeight());
                    viewCloning.setId(model.itemText);
                    viewCloning.setLayoutParams(params);
                    //viewCloning.setLayoutParams(positionParams);

                    //mDraggingAdapter.remove(mDraggingAdapter.getItem((int) view.getTag()));
                    //mDraggingAdapter.notifyDataSetChanged();
                    //((ViewGroup)view.getParent().getParent()).removeView((ViewGroup)view.getParent());
                    viewCloning.setTag(model);
                    //viewCloning.setOnLongClickListener(dragListener);
                    //viewCloning.setOnTouchListener(touchListener);
                    container.addView(viewCloning);
                    view.setVisibility(View.VISIBLE);
                }
                break;
            case DragEvent.ACTION_DRAG_ENDED:
                Log.e("onDrag", "DragEvent.Action_drag_Ended");
                Log.e("DragListener Up", "X: " + v.getX() + ", Y: " + v.getY());
                //v.setBackground(normalShape);
            default:
                break;
        }
        return true;
    }
}

DraggedAdapter:

public class DraggingAdapter extends BaseAdapter {
    private List<ItemModel> data = new ArrayList<>();
    private View.OnTouchListener touchListener;

    public DraggingAdapter(View.OnTouchListener listener) {
        touchListener = listener;
    }

    @Override
    public int getCount() {
        return data.size() > 0 ? data.size() : 0;
    }

    @Override
    public ItemModel getItem(int position) {
        return data.size() == 0 ? new ItemModel(false, 0) : data.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = null;
        if (view == null) {
            view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view, parent,
                    false);
        }
        ItemModel item = getItem(position);
        ((AppCompatTextView) view.findViewById(R.id.textview)).setText("Textview " + item.itemText);
        if (!item.isDragged) {
            view.setOnLongClickListener(longClickListener);
            //view.setOnTouchListener(touchListener);
        }
        view.setBackgroundResource(item.isDragged ? R.drawable.selected_background : R.drawable.grey_background);
        view.setTag(item);
        return view;
    }

    View.OnDragListener onDragListener = new View.OnDragListener()

    {
        @Override
        public boolean onDrag(View v, DragEvent event) {
            return false;
        }
    };

    View.OnLongClickListener longClickListener = new View.OnLongClickListener() {

        @Override
        public boolean onLongClick(View view) {
            ClipData data = ClipData.newPlainText("", "");
            View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
            view.startDrag(data, shadowBuilder, view, 0);
            //view.setVisibility(View.INVISIBLE);
            return true;
        }
    };

    View.OnTouchListener dragListener = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            // start move on a touch event
            if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                ClipData data = ClipData.newPlainText("", "");
                View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
                view.startDrag(data, shadowBuilder, view, 0);
                //view.setVisibility(View.INVISIBLE);
                return true;
            }
            return false;

        }
    };

    public void setData(List<ItemModel> data) {
        this.data = data;
        notifyDataSetChanged();
    }
}

activity_main.xml中:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:baselineAligned="false"
    tools:context="com.example.techjini.draganddrop.MainActivity">

    <ScrollView
        android:layout_width="wrap_content"
        android:layout_height="match_parent" android:fillViewport="true"
        android:layout_weight="0.6">

        <LinearLayout android:orientation="vertical"
            android:id="@+id/framelayout"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </ScrollView>

    <ListView
        android:id="@+id/listview"
        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:layout_weight="0.3"
        android:background="@android:color/white"
        android:dividerHeight="10dp" />
</LinearLayout>

这是我的代码使用此代码我能够从列表视图项拖放到拖动视图里面是Linaerlayout滚动视图但是当我从列表视图项拖动拖动视图然后每次它设置左上角虽然我试图拖动列表视图项目到相同的位置,我将放弃它不应该移动到左上角,我也想从拖动视图中删除项目我不知道如何从拖动视图中删除项目请建议如何可以实现这个比x

0 个答案:

没有答案