研究瞭很久的拖拽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(這裡是字符串),比較好用的一個方法。