拖动实现listview的item改变顺序(DragSortListView)

参考http://blog.csdn.net/forrey/article/details/41355457,完善了下。
利用的是开源项目:https://github.com/bauerca/drag-sort-listview

上代码
MainActivity

package com.example.dragsortlistdemo;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;

import com.mobeta.android.dslv.DragSortListView;
import com.mobeta.android.dslv.DragSortListView.RemoveListener;

public class MainActivity extends Activity {

    private DragSortListView listView;
    private AMDragRateAdapter adapter;
    List<Body> list;// listview的数据源


    // 监听器在手机拖动停下的时候触发
    private DragSortListView.DropListener onDrop = new DragSortListView.DropListener() {
        @Override
        public void drop(int from, int to) {// from to 分别表示 被拖动控件原位置 和目标位置
            if (from != to) {
                Body item = (Body) adapter.getItem(from);// 得到listview的适配器
                adapter.remove(from);// 在适配器中”原位置“的数据。
                adapter.insert(item, to);// 在目标位置中插入被拖动的控件。
            }
        }
    };
    // 删除监听器,点击左边差号就触发。删除item操作。
    private RemoveListener onRemove = new DragSortListView.RemoveListener() {
        @Override
        public void remove(int which) {
            adapter.remove(which);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 取数据设置适配器类的数据源。
        initData();
        // 得到滑动listview并且设置监听器。
        listView.setDropListener(onDrop);
        listView.setRemoveListener(onRemove);

        adapter = new AMDragRateAdapter(MainActivity.this, list);
        listView.setAdapter(adapter);
        listView.setDragEnabled(true); // 设置是否可拖动。

    }

    private void initData() {// 初始化
        String[] array = { "111", "222", "333", "444" };// 初始化数据源
        int Src[] = new int[] { R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher, R.drawable.ic_launcher };// 图片数据源
        list = new ArrayList<Body>();
        for (int i = 0; i < array.length; i++) {
            Body b = new Body();
            b.coin = array[i];
            b.src = Src[i];
            list.add(b);
        }
        listView = (DragSortListView) findViewById(R.id.dslvList);
    }

    public class Body {// 放置adapter数据的类
        int src;
        String coin;

        public int getSrc() {
            return src;
        }

        public void setSrc(int src) {
            this.src = src;
        }

        public String getCoin() {
            return coin;
        }

        public void setCoin(String coin) {
            this.coin = coin;
        }
    }
}

适配器

package com.example.dragsortlistdemo;

import java.util.List;

import com.example.dragsortlistdemo.MainActivity.Body;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class AMDragRateAdapter extends BaseAdapter {

    private Context context;
    List<Body> items;// 适配器的数据源

    public AMDragRateAdapter(Context context, List<Body> list) {
        this.context = context;
        this.items = list;
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public Object getItem(int arg0) {
        return items.get(arg0);
    }

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

    public void remove(int arg0) {// 删除指定位置的item
        items.remove(arg0);
        this.notifyDataSetChanged();// 不要忘记更改适配器对象的数据源
    }

    public void insert(Body item, int arg0) {// 在指定位置插入item
        items.add(arg0, item);
        this.notifyDataSetChanged();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Body item = (Body) getItem(position);
        ViewHolder viewHolder;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = LayoutInflater.from(context).inflate(R.layout.am_rate_drag_item, null);
            viewHolder.tvTitle = (TextView) convertView.findViewById(R.id.tvTitle);
            viewHolder.ivCountryLogo = (ImageView) convertView.findViewById(R.id.ivCountryLogo);
            viewHolder.ivDelete = (ImageView) convertView.findViewById(R.id.click_remove);
            viewHolder.ivDragHandle = (ImageView) convertView.findViewById(R.id.drag_handle);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        viewHolder.tvTitle.setText(item.coin);
        viewHolder.ivCountryLogo.setImageResource(item.src);

        return convertView;
    }

    class ViewHolder {
        TextView tvTitle;
        ImageView ivCountryLogo;
        ImageView ivDelete;
        ImageView ivDragHandle;
    }
}

主界面布局activity_main.xml

<LinearLayout  
    xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:dslv="http://schemas.android.com/apk/res/com.example.dragsortlistdemo"      
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:orientation="vertical">  



    <com.mobeta.android.dslv.DragSortListView   
        android:id="@+id/dslvList"  
        android:layout_width="match_parent"  
        android:layout_height="0dp"  
        android:layout_weight="1.0"  
        android:layout_margin="3dp"  
        android:dividerHeight="1px"  
        android:padding="3dp"  
        dslv:click_remove_id="@id/click_remove"  
        dslv:collapsed_height="1px"  
        dslv:drag_enabled="true"  
        dslv:drag_handle_id="@id/drag_handle"  
        dslv:drag_scroll_start="0.33"  
        dslv:drag_start_mode="onDown"  
        dslv:float_alpha="0.6"  
        dslv:remove_enabled="true"  
        dslv:remove_mode="clickRemove"  
        dslv:slide_shuffle_speed="0.3" />   

</LinearLayout>     

注意这一句:
xmlns:dslv=”http://schemas.android.com/apk/res/com.example.dragsortlistdemo“后面是你的项目的包名。
click_remove_id 和drag_handle_id 这两个属性分别是左边删除按钮和最右边拖动按钮的id。

布局文件am_rate_drag_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="#ffffff"
    android:padding="10dp">

    <ImageView
        android:id="@id/click_remove"
        android:background="@drawable/xx_icon"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_alignParentLeft="true" 
        android:layout_centerVertical="true"
        android:layout_marginRight="10dp"/>

    <ImageView
        android:id="@+id/ivCountryLogo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/click_remove"
            />      
    <TextView
        android:id="@+id/tvTitle"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="15dp"
        android:textColor="#000000"
        android:text="name" 
        android:layout_toRightOf="@id/ivCountryLogo"/>

    <ImageView
        android:id="@id/drag_handle"
        android:background="#000000"
        android:layout_width="40dp"
        android:layout_height="40dp" 
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        />
</RelativeLayout>

还需要ids.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item type="id" name="drag_handle" />
    <item type="id" name="click_remove" />
</resources>

我打包签名时出现了conversion to dalvik format failed with error 1错误,demo没出现,解决办法,将需要的开源库中文件(src中的文件和values中的文件)复制到本地工程。

源码下载http://download.csdn.net/detail/hjqjl/9217703

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值