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