参考http://blog.youkuaiyun.com/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中的文件)复制到本地工程。