当前位置:操作系统 > 安卓/Android >>

Android学习系列(10)--App列表之拖拽ListView(上)

研究了很久的拖拽ListView的实现,受益良多,特此与尔共飨。
      鉴于这部分内容网上的资料少而简陋,而具体的实现过程或许对大家才有帮助,为了详尽而不失真,我们一步一步分析,分成两篇文章。

一、准备。

1.需求问题
      初步:实现列表的拖拽效果(可参考Android源码下packages/apps/Music中的播放列表TouchInterceptor.java源码)。
               (提前说明一下,本文不是完全按照Music中实现的,代码实现方式做了一些调整,去掉来很多无关的东西,方便大家理解,效果上也修改成了另外一种 个人认为是更简单更高效的一套。)
      拓展:借鉴上一篇文章Android学习系列(9)--App列表之分组ListView,实现分组列表的拖拽效果。
      下面以初步实现为例子,逐步展开实现步骤。

2.搭建主界面DragListActivity.java和主布局drag_list_activity.xml。

view sourceprint?01 public class DragListActivity extends Activity { 

02       

03     //数据列表 

04     private List<String> list = null; 

05       

06     //数据适配器 

07     private DragListAdapter adapter = null; 

08       

09     //存放分组标签 

10     public static List<String> groupKey= new ArrayList<String>(); 

11     //分组一 

12     private List<String> navList = new ArrayList<String>(); 

13     //分组二 

14     private List<String> moreList = new ArrayList<String>(); 

15       

16     @Override

17     public void onCreate(Bundle savedInstanceState) { 

18         super.onCreate(savedInstanceState); 

19         setContentView(R.layout.drag_list_activity); 

20           

21         //初始化样本数据 

22         initData(); 

23           

24         //后面会介绍DragListView 

25         DragListView dragListView = (DragListView)findViewById(R.id.drag_list); 

26         adapter = new DragListAdapter(this, list); 

27         dragListView.setAdapter(adapter); 

28     } 

29 }

3.列表项的布局drag_list_item.xml。

view sourceprint?01 <?xml version="1.0" encoding="utf-8"?> 

02 <!-- 强调一点,使用相对布局 -->

03    android:layout_width="fill_parent"

04     android:layout_height="wrap_content"> 

05     <TextView

06        android:id="@+id/drag_list_item_text" 

07        android:layout_width="wrap_content" 

08        android:layout_height="@dimen/drag_item_normal_height"

09       android:paddingLeft="5dip"

10        android:layout_alignParentLeft="true"

11        android:layout_centerVertical="true"

12        android:gravity="center_vertical"/> 

13     <ImageView android:id="@+id/drag_list_item_image"

14        android:src="@drawable/list_icon"

15        android:layout_alignParentRight="true"

16        android:layout_centerVertical="true"

17        android:layout_width="wrap_content"

18        android:layout_height="@dimen/drag_item_normal_height"/> 

19 </RelativeLayout>

4.准备样本数据。
      我已经准备好了两组数据,在前面提到的initData()方法中执行初始化。

view sourceprint?01 public void initData(){ 

02     //数据结果 

03     list = new ArrayList<String>(); 

04       

05     //groupKey存放的是分组标签 

06     groupKey.add("A组"); 

07     groupKey.add("B组"); 

08       

09     for(int i=0; i<5; i++){ 

10         navList.add("A选项"+i); 

11     } 

12     list.add("A组"); 

13     list.addAll(navList); 

14       

15     for(int i=0; i<8; i++){ 

16         moreList.add("B选项"+i); 

17     } 

18     list.add("B组"); 

19     list.addAll(moreList); 

20 }

      这里定义了分组标签集合groupKey后面分组的时候会用到。

5.自定义适配器类DragListAdapter。
      接着我们搭建数据适配器,负责把list的数据填充到ListView中。

view sourceprint?01 public static class DragListAdapter extends ArrayAdapter<String>{ 

02     public DragListAdapter(Context context, List<String> objects) { 

03         super(context, 0, objects); 

04     } 

05     @Override

06     public View getView(int position, View convertView, ViewGroup parent) { 

07         View view = convertView; 

08         if(view==null){ 

09             //加载列表项模板 

10             view = LayoutInflater.from(getContext()).inflate(R.layout.drag_list_item, null); 

11         }             

12         TextView textView = (TextView)view.findViewById(R.id.drag_list_item_text); 

13         textView.setText(getItem(position)); 

14         return view; 

15     } 

16 }

       注意getItem(position)会取得数组适配器中position位置的T(这里是字符串),比较好用的一个方法。

  

补充:移动开发 , Android ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,