Android跨屏拖动item,android中如何实现两个listview中的item可以互相拖拽移位?
這兩天自己baidu+google,簡單解決了一些問題,暫且先貼上來。
因為是我的一個作業,所以還有一些按鈕的點擊事件,大家可以忽略。
這些源碼僅僅實現了簡單的”將制定控件拖拽到某個區域“,還沒有實現”拖拽到指定位置“,后續解決了之后會在貼上來
package com.example.alpha.app2_4;
import android.app.Activity;
import android.content.ClipData;
import android.content.ClipDescription;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Point;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.DragEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.Arrays;
public class MainActivity extends Activity implements OnClickListener {
ListView lv1;
ListView lv2;
LinearLayout targetLayout,fromLayout;
ArrayAdapter arr_Adapter;
ArrayAdapterarr_Adapter2;
Button bt1;
Button bt2;
Button bt3;
Button bt4;
Button bt5;
Button bt6;
static int po_l = 0,po_r=0;
ArrayListarr_data1=new ArrayList(Arrays.asList("上海",
"南京", "武漢", "北京", "重慶", "深圳", "蘭州", "沈陽") );
ArrayList arr_data2;
static Boolean flag=true;//定義左右標志
static int longClick_Flag;//定義長按左右標志
//實例化拖拽項目監聽器
MyDragEventListener myDragEventListener=new MyDragEventListener();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt1 = (Button) findViewById(R.id.button1);
bt2 = (Button) findViewById(R.id.button2);
bt3 = (Button) findViewById(R.id.button3);
bt4 = (Button) findViewById(R.id.button4);
bt5 = (Button) findViewById(R.id.button5);
bt6 = (Button) findViewById(R.id.button6);
lv1 = (ListView) findViewById(R.id.listView1);
lv2 = (ListView) findViewById(R.id.listView2);
bt1.setOnClickListener(this);
bt2.setOnClickListener(this);
bt3.setOnClickListener(this);
bt4.setOnClickListener(this);
bt5.setOnClickListener(this);
bt6.setOnClickListener(this);
arr_Adapter = new ArrayAdapter(this,
android.R.layout.simple_list_item_1, arr_data1);
lv1.setAdapter(arr_Adapter);
lv1.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view,
int position, long id) {
po_l=position;
flag=true;//true即點擊了lv1
Log.d("tag", "po_l="+po_l);
}
});
arr_data2=new ArrayList();
arr_Adapter2=new ArrayAdapter(this, android.R.layout.simple_list_item_1,arr_data2);
lv2.setAdapter(arr_Adapter2);
lv2.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
po_r=position;
flag=false;//false即點擊了lv2
}
});
/**
* Drag_Start
*/
targetLayout= (LinearLayout) findViewById(R.id.TargetLayout);
fromLayout= (LinearLayout) findViewById(R.id.FromLayout);
lv1.setOnItemLongClickListener(lv1LongClickListener);
lv2.setOnItemLongClickListener(lv2LongClickListener);
lv1.setOnDragListener(myDragEventListener);
targetLayout.setOnDragListener(myDragEventListener);
fromLayout.setOnDragListener(myDragEventListener);
lv2.setOnDragListener(myDragEventListener);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
//左移
case R.id.button1:
if (lv2.getChildCount()>=po_r+1) {
String cu=(String)lv2.getItemAtPosition(po_r);
Log.d("tag", "count="+lv2.getChildCount()+"po_l"+po_r);
arr_data2.remove(po_r);
arr_data1.add(cu);
arr_Adapter.notifyDataSetChanged();
}
else {
Toast.makeText(MainActivity.this,"當前位置已無內容",Toast.LENGTH_SHORT).show();
}
arr_Adapter2.notifyDataSetChanged();
break;
//右移
case R.id.button2:
if (lv1.getChildCount()>=po_l+1) {
String cu=(String)lv1.getItemAtPosition(po_l);
Log.d("tag", "count="+lv1.getChildCount()+"po_l"+po_l);
arr_data1.remove(po_l);
arr_data2.add(cu);
arr_Adapter2.notifyDataSetChanged();
}
else {
Toast.makeText(MainActivity.this,"當前位置已無內容",Toast.LENGTH_SHORT).show();
}
arr_Adapter.notifyDataSetChanged();
break;
//全部左移
case R.id.button3:
arr_data1.addAll(arr_data2);
arr_data2.clear();
arr_Adapter.notifyDataSetChanged();
arr_Adapter2.notifyDataSetChanged();
break;
//全部右移
case R.id.button4:
arr_data2.addAll(arr_data1);
arr_data1.clear();
arr_Adapter.notifyDataSetChanged();
arr_Adapter2.notifyDataSetChanged();
break;
//上移
case R.id.button5:
if(flag&&po_l>0){
String ch=arr_data1.get(po_l);
arr_data1.remove(po_l);
arr_data1.add(po_l-1,ch);
arr_Adapter.notifyDataSetChanged();
po_l--;
}
else if(!flag&&po_r>0){
String ch=arr_data2.get(po_r);
arr_data2.remove(po_r);
arr_data2.add(po_r-1,ch);
arr_Adapter2.notifyDataSetChanged();
po_r--;
}
break;
//下移
case R.id.button6:
if(flag&&po_l
String ch=arr_data1.get(po_l);
arr_data1.remove(po_l);
arr_data1.add(po_l+1,ch);
arr_Adapter.notifyDataSetChanged();
po_l++;
}
else if(!flag&&po_r
String ch=arr_data2.get(po_r);
arr_data2.remove(po_r);
arr_data2.add(po_r+1,ch);
arr_Adapter2.notifyDataSetChanged();
po_r++;
}
break;
default:
break;
}
}
/**
* DragStart_to_End
*/
//listView1長按事件
AdapterView.OnItemLongClickListener lv1LongClickListener=new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView> parent, View view, int position, long id) {
longClick_Flag=1;
//po_l=position;
// 將被拖動item傳遞到clipData
ClipData.Item item=new ClipData.Item(arr_data1.get(position));
String[] clipDescription={ClipDescription.MIMETYPE_TEXT_PLAIN};
ClipData dragData=new ClipData((CharSequence) view.getTag(),clipDescription,item);
//制造拖動影像
View.DragShadowBuilder myShadow=new MyDragShadowBuilder(view);
view.startDrag(dragData,myShadow,arr_data1.get(position),0);
return true;
}
};
//listView2長按事件
AdapterView.OnItemLongClickListener lv2LongClickListener=new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView> parent, View view, int position, long id) {
longClick_Flag=2;
//po_r=position;
// 將被拖動item傳遞到clipData
ClipData.Item item=new ClipData.Item(arr_data2.get(position));
String[] clipDescription={ClipDescription.MIMETYPE_TEXT_PLAIN};
ClipData dragData=new ClipData((CharSequence) view.getTag(),clipDescription,item);
//制造拖動影像
View.DragShadowBuilder myShadow=new MyDragShadowBuilder(view);
view.startDrag(dragData,myShadow,arr_data2.get(position),0);
return true;
}
};
//監聽拖拽事件和狀態
protected class MyDragEventListener implements View.OnDragListener{
@Override
public boolean onDrag(View v, DragEvent event) {//v代表目標視圖
//定義拖拽狀態
final int action=event.getAction();
switch (action){
//鼠標長按下開始拖動
case DragEvent.ACTION_DRAG_STARTED:
// All involved view accept ACTION_DRAG_STARTED for
// MIMETYPE_TEXT_PLAIN
if (event.getClipDescription().hasMimeType(
ClipDescription.MIMETYPE_TEXT_PLAIN)) {
return true; // Accept
} else {
return false; // reject
}
case DragEvent.ACTION_DRAG_ENTERED:
return true;
case DragEvent.ACTION_DRAG_LOCATION:
return true;
case DragEvent.ACTION_DRAG_EXITED:
return true;
case DragEvent.ACTION_DROP:
// Gets the item containing the dragged data
//獲取被拖動的item
ClipData.Item item = event.getClipData().getItemAt(0);
// If apply only if drop on buttonTarget
//由左向右拖動
if (v == targetLayout||v==lv2) {
String droppedItem = item.getText().toString();
arr_data2.add(droppedItem);
arr_Adapter2.notifyDataSetChanged();
arr_data1.remove(droppedItem);
arr_Adapter.notifyDataSetChanged();
return true;
}
//由右向左拖動
if (v == fromLayout||v==lv1) {
String droppedItem = item.getText().toString();
arr_data1.add(droppedItem);
arr_Adapter.notifyDataSetChanged();
arr_data2.remove(droppedItem);
arr_Adapter2.notifyDataSetChanged();
return true;
}
return true;
case DragEvent.ACTION_DRAG_ENDED:
return true;
default: // unknown case
return false;
}
}
}
//構造拖動影像
private static class MyDragShadowBuilder extends View.DragShadowBuilder{
private static Drawable shadow;
//生成影像
public MyDragShadowBuilder(View view) {
super(view);
shadow=new ColorDrawable(Color.LTGRAY);
}
//設置影像參數
@Override
public void onProvideShadowMetrics(Point shadowSize, Point shadowTouchPoint) {
super.onProvideShadowMetrics(shadowSize, shadowTouchPoint);
int width=getView().getWidth();
int height=getView().getHeight();
shadow.setBounds(0,0,width,height);
shadowSize.set(width,height);
shadowTouchPoint.set(width/2,height/2);
}
//畫影像
@Override
public void onDrawShadow(Canvas canvas) {
//super.onDrawShadow(canvas);
shadow.draw(canvas);
}
}
}
總結
以上是生活随笔為你收集整理的Android跨屏拖动item,android中如何实现两个listview中的item可以互相拖拽移位?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 周鸿祎离婚给前妻90亿 李国庆羡慕:没争
- 下一篇: 微软 Win11 系统再现玄学 Bug,