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);
    }
}

posted @ 2011-07-14 10:47  网络渔夫  阅读(788)  评论(0编辑  收藏  举报