可拖拽listview基本使用技巧(DragSortListView)

  可拖拽的listview,DragSortListView这是gitHub上的一个开源项目。链接点击打开链接。这个开源控件主要是为了实现listview的 item上下拖拽效果以便达到美化界面的作用。

      先来看三张效果图。

     

 第一张为初始的DragSortListView效果图。再来看下面拖动效果的。



这张就是在点击item右端黑色按钮后的拖动效果(看起来还不错的样子。。。。。。)



     最后拖动结束item位置互换。


 


基本用法

 

1 布局。

       先来看主界面布局。

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <LinearLayout  
  2.     xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:dslv="http://schemas.android.com/apk/res/com.mobeta.android.demodslv"      
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     android:orientation="vertical">  
  7.       
  8.        
  9.   
  10.     <com.mobeta.android.dslv.DragSortListView   
  11.         android:id="@+id/dslvList"  
  12.         android:layout_width="match_parent"  
  13.         android:layout_height="0dp"  
  14.         android:layout_weight="1.0"  
  15.         android:layout_margin="3dp"  
  16.         android:dividerHeight="1px"  
  17.         android:padding="3dp"  
  18.         dslv:click_remove_id="@id/click_remove"  
  19.         dslv:collapsed_height="1px"  
  20.         dslv:drag_enabled="true"  
  21.         dslv:drag_handle_id="@id/drag_handle"  
  22.         dslv:drag_scroll_start="0.33"  
  23.         dslv:drag_start_mode="onDown"  
  24.         dslv:float_alpha="0.6"  
  25.         dslv:remove_enabled="true"  
  26.         dslv:remove_mode="clickRemove"  
  27.         dslv:slide_shuffle_speed="0.3" />   
  28.     
  29. </LinearLayout>      

 这里重点讲一下 click_remove_id  和drag_handle_id 这两个属性。这两个属性的值,分别是左边红色删除按钮和最右边拖动按钮的id。

 

接下来是item布局

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <RelativeLayout  
  3.     xmlns:android="http://schemas.android.com/apk/res/android"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="50dp"  
  6.     android:background="#ffffff"  
  7.     android:padding="10dp">  
  8.       
  9.     <ImageView  
  10.         android:id="@id/click_remove"  
  11.         android:background="@drawable/delete_x"  
  12.         android:layout_width="40dp"  
  13.         android:layout_height="40dp"  
  14.         android:layout_alignParentLeft="true"   
  15.         android:layout_centerVertical="true"  
  16.         android:layout_marginRight="10dp"/>  
  17.       
  18.     <ImageView  
  19.         android:id="@+id/ivCountryLogo"  
  20.         android:layout_width="wrap_content"  
  21.         android:layout_height="wrap_content"  
  22.         android:layout_toRightOf="@id/click_remove"  
  23.             />         
  24.     <TextView  
  25.         android:id="@+id/tvTitle"  
  26.         android:layout_width="wrap_content"  
  27.         android:layout_height="wrap_content"  
  28.         android:padding="15dp"  
  29.         android:textColor="#000000"  
  30.         android:text="name"   
  31.         android:layout_toRightOf="@id/ivCountryLogo"/>  
  32.       
  33.     <ImageView  
  34.         android:id="@id/drag_handle"  
  35.         android:background="#000000"  
  36.         android:layout_width="40dp"  
  37.         android:layout_height="40dp"   
  38.         android:layout_alignParentRight="true"  
  39.         android:layout_centerVertical="true"  
  40.         />  
  41. </RelativeLayout>  

这里没什么好讲的。


接下来将重点内容。适配器和编写和DragSortListView的设置。

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.mobeta.android.demodslv;  
  2.   
  3. import java.util.List;  
  4.   
  5. import com.mobeta.android.demodslv.AMRateDragActivity.body;  
  6.   
  7. import android.content.Context;  
  8. import android.view.LayoutInflater;  
  9. import android.view.View;  
  10. import android.view.ViewGroup;  
  11. import android.widget.BaseAdapter;  
  12. import android.widget.ImageView;  
  13. import android.widget.TextView;  
  14.   
  15. public class AMDragRateAdapter extends BaseAdapter {  
  16.       
  17.     private Context context;  
  18.     List<body> items;//适配器的数据源  
  19.       
  20.        
  21.     public AMDragRateAdapter(Context context,List<body> list){  
  22.         this.context = context;  
  23.         this.items = list;  
  24.     }  
  25.       
  26.        
  27.   
  28.     @Override  
  29.     public int getCount() {  
  30.         // TODO Auto-generated method stub  
  31.         return items.size();  
  32.     }  
  33.   
  34.     @Override  
  35.     public Object getItem(int arg0) {  
  36.         // TODO Auto-generated method stub  
  37.         return items.get(arg0);  
  38.     }  
  39.   
  40.     @Override  
  41.     public long getItemId(int arg0) {  
  42.         // TODO Auto-generated method stub  
  43.         return arg0;  
  44.     }  
  45.       
  46.     public void remove(int arg0) {//删除指定位置的item  
  47.         items.remove(arg0);  
  48.         this.notifyDataSetChanged();//不要忘记更改适配器对象的数据源  
  49.     }  
  50.       
  51.     public void insert(body item, int arg0) {在指定位置插入item  
  52.         items.add(arg0, item);  
  53.         this.notifyDataSetChanged();  
  54.     }  
  55.   
  56.     @Override  
  57.     public View getView(int position, View convertView, ViewGroup parent) {  
  58.         body item = (body)getItem(position);  
  59.         ViewHolder viewHolder;  
  60.         if(convertView==null){  
  61.             viewHolder = new ViewHolder();  
  62.             convertView = LayoutInflater.from(context).inflate(R.layout.am_rate_drag_item, null);  
  63.             viewHolder.tvTitle = (TextView) convertView.findViewById(R.id.tvTitle);  
  64.             viewHolder.ivCountryLogo = (ImageView) convertView.findViewById(R.id.ivCountryLogo);  
  65.             viewHolder.ivDelete = (ImageView) convertView.findViewById(R.id.click_remove);  
  66.             viewHolder.ivDragHandle = (ImageView) convertView.findViewById(R.id.drag_handle);  
  67.             convertView.setTag(viewHolder);  
  68.         }else{  
  69.             viewHolder = (ViewHolder) convertView.getTag();  
  70.         }  
  71.           
  72.         viewHolder.tvTitle.setText(item.coin);  
  73.         viewHolder.ivCountryLogo.setImageResource(item.src);  
  74.           
  75.            
  76.           
  77.         return convertView;  
  78.     }  
  79.       
  80.     class ViewHolder {  
  81.         TextView tvTitle;  
  82.         ImageView ivCountryLogo;  
  83.         ImageView ivDelete;  
  84.         ImageView ivDragHandle;  
  85.     }  
  86. }  

           这个适配器代码有两段代码比较重要。一个是remove,这个函数是当item被移动到另一个item位置的时候,把适配器内原有的数据删除。另一个就是insert。这个是为了在item移动到另一个位置的时候,将数据插入到适配器的指定位置。(这一点可以类比 线性表的移动移动操作,将原位置的数据delete掉,然后再目的位置insert。)

   

         2 DragSortListView在activity中的设置。

         

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. import android.app.Activity;  
  2. import android.os.Bundle;  
  3. import android.util.Log;  
  4. import android.view.View;  
  5. import android.view.View.OnClickListener;  
  6. import android.widget.Button;  
  7.   
  8. import com.mobeta.android.dslv.DragSortListView;  
  9. import com.mobeta.android.dslv.DragSortListView.RemoveListener;  
  10.   
  11. public class AMRateDragActivity extends Activity {  
  12.   
  13.     private DragSortListView listView;  
  14.     private AMDragRateAdapter adapter;  
  15.     private Button btnEdit;  
  16.     List<body> l;//listview的数据源  
  17.    
  18.     int Src[]=new int[]{R.drawable.aa,R.drawable.bb,R.drawable.cc,R.drawable.dd};//图片数据源  
  19.        
  20.         //监听器在手机拖动停下的时候触发  
  21.       private DragSortListView.DropListener onDrop =  
  22.          new DragSortListView.DropListener() {  
  23.              @Override  
  24.             public void drop(int from, int to) {//from to 分别表示 被拖动控件原位置 和目标位置  
  25.                 if (from != to) {  
  26.                     body item = (body)adapter.getItem(from);//得到listview的适配器  
  27.                     adapter.remove(from);//在适配器中”原位置“的数据。  
  28.                     adapter.insert(item, to);//在目标位置中插入被拖动的控件。  
  29.                 }  
  30.             }  
  31.         };  
  32.     //删除监听器,点击左边差号就触发。删除item操作。  
  33.     private RemoveListener onRemove =  
  34.         new DragSortListView.RemoveListener() {  
  35.             @Override  
  36.             public void remove(int which) {  
  37.                 adapter.remove(which);  
  38.             }  
  39.         };  
  40.                        
  41.     @Override  
  42.     protected void onCreate(Bundle savedInstanceState) {  
  43.         super.onCreate(savedInstanceState);  
  44.         setContentView(R.layout.am_rate_drag);  
  45.         //取数据设置适配器类的数据源。  
  46.         initData();  
  47.         //得到滑动listview并且设置监听器。  
  48.           
  49.         listView.setDropListener(onDrop);  
  50.         listView.setRemoveListener(onRemove);  
  51.           
  52.           
  53.         adapter = new AMDragRateAdapter(AMRateDragActivity.this, l);  
  54.         listView.setAdapter(adapter);          
  55.         listView.setDragEnabled(true); //设置是否可拖动。   
  56.          
  57.     }  
  58.       
  59.     private void initData() {//初始化  
  60.          String[] array = getResources().getStringArray(R.array.module_name);//初始化数据源  
  61.          ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(array));  
  62.          l=new ArrayList<body>();  
  63.          for(int i=0;i<4;i++){  
  64.             body b=new body();  
  65.             b.coin=arrayList.get(i);  
  66.             b.src=Src[i];  
  67.             l.add(b);  
  68.          }  
  69.         listView = (DragSortListView) findViewById(R.id.dslvList);  
  70.     }  
  71.     public class body{//放置adapter数据的类  
  72.         int src;  
  73.         String coin;  
  74.         public int getSrc() {  
  75.             return src;  
  76.         }  
  77.         public void setSrc(int src) {  
  78.             this.src = src;  
  79.         }  
  80.         public String getCoin() {  
  81.             return coin;  
  82.         }  
  83.         public void setCoin(String coin) {  
  84.             this.coin = coin;  
  85.         }  
  86.     }  
  87. }  

转载于:https://my.oschina.net/u/266323/blog/472424

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值