java - android中如何实现两个listview中的item可以互相拖拽移位?
巴扎黑
巴扎黑 2017-04-17 17:38:23
0
1
357

网上搜了搜,都是一个listview内部拖拽的,怎么实现两个listview之间的相互拖拽呢

巴扎黑
巴扎黑

membalas semua(1)
迷茫

Dalam dua hari yang lalu, saya telah baidu google dan menyelesaikan beberapa masalah secara ringkas, jadi saya akan menyiarkannya di sini buat masa ini.
Oleh kerana ia adalah kerja rumah saya, terdapat juga beberapa acara klik butang, yang anda boleh abaikan.
Kod sumber ini hanya melaksanakan "seret dan lepas kawalan yang ditentukan ke kawasan tertentu", dan belum lagi melaksanakan "seret dan lepas ke lokasi yang ditentukan", saya akan menyiarkannya selepas penyelesaian selesai

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<String> arr_Adapter;
    ArrayAdapter<String>arr_Adapter2;
    Button bt1;
    Button bt2;
    Button bt3;
    Button bt4;
    Button bt5;
    Button bt6;
    static int po_l = 0,po_r=0;
    ArrayList<String>arr_data1=new ArrayList<String>(Arrays.asList("上海",
            "南京", "武汉", "北京", "重庆", "深圳", "兰州", "沈阳") );
    ArrayList<String> 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<String>(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<String>();
        arr_Adapter2=new ArrayAdapter<String>(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<lv1.getChildCount()-1){
                    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<lv2.getChildCount()-1){
                    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);
        }
    }

}
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan