ListView的Item中的图片拖拽功能的实现

  最近项目中要用到,所以做了个,刚开始做出来,可能有些地方还没有考虑完整,不过可以拿来参考一下。其实最主要的就是使用了一个自定义的BaseAdapter,在其中的getView方法中,为模板中的图片控件增加了onTouchListener事件即可实现。

    运行效果如下:

 
主布局文件:
1  <? xml version="1.0" encoding="utf-8" ?>
2  < LinearLayout  xmlns:android ="http://schemas.android.com/apk/res/android"
3      android:orientation ="vertical"  android:layout_width ="fill_parent"
4      android:layout_height ="fill_parent" >
5       < ListView  android:id ="@+id/lvDemo"  android:layout_width ="fill_parent"
6          android:layout_height ="wrap_content"   />
7  </ LinearLayout >

主布局文件中列表的项模板如下:

 1  <? xml version="1.0" encoding="utf-8" ?>
 2  < LinearLayout  xmlns:android ="http://schemas.android.com/apk/res/android"
 3      android:layout_width ="fill_parent"  android:layout_height ="wrap_content"
 4      android:orientation ="horizontal"  android:layout_gravity ="center"
 5      android:paddingTop ="5dp"  android:paddingBottom ="5dp" >
 6       < FrameLayout  android:id ="@+id/flContainer"
 7          android:layout_width ="fill_parent"  android:layout_height ="wrap_content" >
 8           < TextView  android:id ="@+id/tvShowTitle"  android:layout_width ="wrap_content"
 9              android:layout_height ="wrap_content"  android:paddingLeft ="110dp"
10              android:paddingTop ="10dp"  android:textSize ="16sp" >
11           </ TextView >
12           < ImageView  android:id ="@+id/ivLogo"  android:layout_width ="100dp"
13              android:layout_height ="80dp"   />
14           < ImageView  android:id ="@+id/ivAlphaImg"
15              android:layout_width ="80dp"  android:background ="@drawable/pi"
16              android:layout_height ="80dp"   />
17       </ FrameLayout >
18  </ LinearLayout >

自定义适配器:

  1  package  com.studio.basf.animationdemo;
  2 
  3  import  java.util.ArrayList;
  4  import  java.util.HashMap;
  5 
  6  import  android.content.Context;
  7  import  android.util.DisplayMetrics;
  8  import  android.view.LayoutInflater;
  9  import  android.view.MotionEvent;
 10  import  android.view.View;
 11  import  android.view.View.OnTouchListener;
 12  import  android.view.ViewGroup;
 13  import  android.widget.BaseAdapter;
 14  import  android.widget.ImageView;
 15  import  android.widget.TextView;
 16 
 17  public   class  CustomAdapter  extends  BaseAdapter  implements  OnTouchListener {
 18 
 19       private  LayoutInflater mInflater;
 20       private  ViewHolder holder;
 21       private  ArrayList < HashMap < String, String >>  list;
 22       private   int  resource, lastX, lastY, vLeft, vTop,vRight, vBottom;
 23       private  HashMap < String, Object >  hashMap;
 24       private  String[] from;
 25       private   int [] to;
 26       private  Context context;
 27 
 28       //  自定义容器类
 29       class  ViewHolder {
 30 
 31           public  ArrayList < ImageView >  getIvCollections() {
 32               return  ivCollections;
 33          }
 34 
 35           public   void  setIvCollections(ArrayList < ImageView >  ivCollections) {
 36               this .ivCollections  =  ivCollections;
 37          }
 38 
 39           public  TextView getTvShowTitle() {
 40               return  tvShowTitle;
 41          }
 42 
 43           public   void  setTvShowTitle(TextView tvShowTitle) {
 44               this .tvShowTitle  =  tvShowTitle;
 45          }
 46 
 47           private  ArrayList < ImageView >  ivCollections;
 48           private  TextView tvShowTitle;
 49      }
 50 
 51       public  CustomAdapter(Context context,
 52              ArrayList < HashMap < String, String >>  list,  int  resource,
 53              String[] from,  int [] to) {
 54           this .list  =  list;
 55           this .mInflater  =  LayoutInflater.from(context);
 56           this .resource  =  resource;
 57           this .from  =  from;
 58           this .to  =  to;
 59           this .hashMap  =   new  HashMap < String, Object > ();
 60           this .context  =  context;
 61      }
 62 
 63      @Override
 64       public   int  getCount() {
 65           //  TODO Auto-generated method stub
 66           return  list.size();
 67      }
 68 
 69      @Override
 70       public  Object getItem( int  position) {
 71           //  TODO Auto-generated method stub
 72           return  list.get(position);
 73      }
 74 
 75      @Override
 76       public   long  getItemId( int  position) {
 77           //  TODO Auto-generated method stub
 78           return  position;
 79      }
 80 
 81      @Override
 82       public  View getView( int  position, View convertView, ViewGroup parent) {
 83           //  TODO Auto-generated method stub
 84           if  (convertView  ==   null ) {
 85              holder  =   new  ViewHolder();
 86              convertView  =  mInflater.inflate(resource,  null );
 87 
 88              ArrayList < ImageView >  ivList  =   new  ArrayList < ImageView > ();
 89              ivList.add((ImageView) convertView.findViewById(R.id.ivLogo));
 90              ivList.add((ImageView) convertView.findViewById(R.id.ivAlphaImg));
 91               //  装载ImageView
 92              holder.setIvCollections(ivList);
 93               //  装载TextView
 94              holder.setTvShowTitle((TextView) convertView.findViewById(to[ 0 ]));
 95 
 96              convertView.setTag(holder);
 97          }  else  {
 98              holder  =  (ViewHolder) convertView.getTag();
 99          }
100 
101           //  获取单项数据
102          HashMap < String, String >  hashMap  =  list.get(position);
103 
104          holder.getIvCollections().get( 0 )
105                  .setBackgroundResource(R.drawable.anim2);
106          holder.getIvCollections().get( 0 ).setOnTouchListener( this );
107 
108          holder.getIvCollections().get( 1 ).getBackground().setAlpha( 200 );
109          holder.getTvShowTitle().setText(hashMap.get(from[ 0 ]));
110 
111           return  convertView;
112      }
113 
114      @Override
115       public   boolean  onTouch(View v, MotionEvent event) {
116           //  TODO Auto-generated method stub
117           switch  (event.getAction()) {
118           case  MotionEvent.ACTION_DOWN:
119              lastX  =  ( int ) event.getRawX();
120              lastY  =  ( int ) event.getRawY();
121 
122               if  (hashMap.isEmpty()) {
123                  hashMap.put( " l " , v.getLeft());
124                  hashMap.put( " t " , v.getTop());
125                  hashMap.put( " r " , GetScreenWidth());
126                  hashMap.put( " b " , v.getBottom());
127              }
128              
129               //  获取遮罩层的位置
130              vLeft  =  Integer.parseInt(hashMap.get( " l " ).toString());
131              vTop  =  Integer.parseInt(hashMap.get( " t " ).toString());
132              vRight  =  Integer.parseInt(hashMap.get( " r " ).toString());
133              vBottom  =  Integer.parseInt(hashMap.get( " b " ).toString());
134 
135               break ;
136           case  MotionEvent.ACTION_MOVE:
137               int  dx  =  ( int ) event.getRawX()  -  lastX;
138               int  dy  =  ( int ) event.getRawY()  -  lastY;
139 
140               int  left  =  v.getLeft()  +  dx;
141               int  top  =  v.getTop()  +  dy;
142               int  right  =  v.getRight()  +  dx;
143               int  bottom  =  v.getBottom()  +  dy;
144 
145               if  (left  <  vLeft) {
146                  left  =  vLeft;
147                  right  =  left  +  v.getWidth();
148              }
149 
150               if  (top  <  vTop) {
151                  top  =  vTop;
152                  bottom  =  top  +  v.getHeight();
153              }
154              
155               if (right  >  vRight){
156                  right  =  vRight;
157                  left  =  right  -  v.getWidth();
158              }
159              
160               if  (bottom  >  vBottom) {
161                  bottom  =  vBottom;
162                  top  =  bottom  -  v.getHeight();
163              }
164 
165              v.layout(left, top, right, bottom);
166 
167              lastX  =  ( int ) event.getRawX();
168              lastY  =  ( int ) event.getRawY();
169 
170               break ;
171           case  MotionEvent.ACTION_UP:
172               break ;
173          }
174           return   true ;
175      }
176 
177       /**
178       * 获取屏幕宽度,将其作为图片拖拽到屏幕最右端时的终止坐标
179       *  @return  屏幕宽度
180        */
181       private   int  GetScreenWidth(){
182          DisplayMetrics dm  =  context.getResources().getDisplayMetrics();
183           return  dm.widthPixels;
184      }
185  }

调用代码如下:

package  com.studio.basf.animationdemo;

import  java.util.ArrayList;
import  java.util.HashMap;

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

public   class  MainActivity  extends  Activity {
    
/**  Called when the activity is first created.  */
    
private  ArrayList < HashMap < String,String >>  list;
    
private  ListView lvDemo;
    @Override
    
public   void  onCreate(Bundle savedInstanceState) {
        
super .onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        list 
=   new  ArrayList < HashMap < String,String >> ();
        lvDemo 
=  (ListView)findViewById(R.id.lvDemo);
        addDataTolvDemo();
    }

    
private   void  addDataTolvDemo() {
        
        HashMap
< String,String >  hashMap0  =   new  HashMap < String,String > ();
        hashMap0.put(
" title " " 不要乱猜哦,我是标题哈~~ " );
        list.add(hashMap0);
        
        HashMap
< String,String >  hashMap1  =   new  HashMap < String,String > ();
        hashMap1.put(
" title " " 不要乱猜哦,我是标题哈~~ " );
        list.add(hashMap1);
        
        HashMap
< String,String >  hashMap2  =   new  HashMap < String,String > ();
        hashMap2.put(
" title " " 不要乱猜哦,我是标题哈~~ " );
        list.add(hashMap2);
        
        HashMap
< String,String >  hashMap3  =   new  HashMap < String,String > ();
        hashMap3.put(
" title " " 不要乱猜哦,我是标题哈~~ " );
        list.add(hashMap3);
        
        HashMap
< String,String >  hashMap4  =   new  HashMap < String,String > ();
        hashMap4.put(
" title " " 不要乱猜哦,我是标题哈~~ " );
        list.add(hashMap4);
        
        CustomAdapter adapter 
=   new  CustomAdapter( this , list,
                R.layout.main_item, 
new  String[] {  " title "  },
                
new   int [] { R.id.tvShowTitle });
        lvDemo.setAdapter(adapter);
    }
}

你可能感兴趣的:(ListView)