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

来源:互联网 发布:知微科技有限公司 编辑:程序博客网 时间:2024/05/21 08:53

参考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 0
原创粉丝点击