可拖拽的listview,DragSortListView這是gitHub上的一個開源項目。連接點擊打開連接。這個開源控件主要是爲了實現listview的 item上下拖拽效果以便達到美化界面的做用。 html
先來看三張效果圖。 java
第一張爲初始的DragSortListView效果圖。再來看下面拖動效果的。 android
這張就是在點擊item右端黑色按鈕後的拖動效果(看起來還不錯的樣子。。。。。。) git
最後拖動結束item位置互換。 github
基本用法 app
1 佈局。 ide
先來看主界面佈局。 函數
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:dslv="http://schemas.android.com/apk/res/com.mobeta.android.demodslv"
- 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>
這裏重點講一下 click_remove_id 和drag_handle_id 這兩個屬性。這兩個屬性的值,分別是左邊紅色刪除按鈕和最右邊拖動按鈕的id。 佈局
接下來是item佈局 this
- <?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/delete_x"
- 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>
這裏沒什麼好講的。
接下來將重點內容。適配器和編寫和DragSortListView的設置。
- package com.mobeta.android.demodslv;
-
- import java.util.List;
-
- import com.mobeta.android.demodslv.AMRateDragActivity.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() {
- // TODO Auto-generated method stub
- return items.size();
- }
-
- @Override
- public Object getItem(int arg0) {
- // TODO Auto-generated method stub
- return items.get(arg0);
- }
-
- @Override
- public long getItemId(int arg0) {
- // TODO Auto-generated method stub
- 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;
- }
- }
這個適配器代碼有兩段代碼比較重要。一個是remove,這個函數是當item被移動到另外一個item位置的時候,把適配器內原有的數據刪除。另外一個就是insert。這個是爲了在item移動到另外一個位置的時候,將數據插入到適配器的指定位置。(這一點能夠類比 線性表的移動移動操做,將原位置的數據delete掉,而後再目的位置insert。)
2 DragSortListView在activity中的設置。
- import android.app.Activity;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
-
- import com.mobeta.android.dslv.DragSortListView;
- import com.mobeta.android.dslv.DragSortListView.RemoveListener;
-
- public class AMRateDragActivity extends Activity {
-
- private DragSortListView listView;
- private AMDragRateAdapter adapter;
- private Button btnEdit;
- List<body> l;//listview的數據源
-
- int Src[]=new int[]{R.drawable.aa,R.drawable.bb,R.drawable.cc,R.drawable.dd};//圖片數據源
-
- //監聽器在手機拖動停下的時候觸發
- 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.am_rate_drag);
- //取數據設置適配器類的數據源。
- initData();
- //獲得滑動listview而且設置監聽器。
-
- listView.setDropListener(onDrop);
- listView.setRemoveListener(onRemove);
-
-
- adapter = new AMDragRateAdapter(AMRateDragActivity.this, l);
- listView.setAdapter(adapter);
- listView.setDragEnabled(true); //設置是否可拖動。
-
- }
-
- private void initData() {//初始化
- String[] array = getResources().getStringArray(R.array.module_name);//初始化數據源
- ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(array));
- l=new ArrayList<body>();
- for(int i=0;i<4;i++){
- body b=new body();
- b.coin=arrayList.get(i);
- b.src=Src[i];
- l.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;
- }
- }
- }