Android學習系列(10)–App列表之拖拽ListView(上) – Android移動開發技術文章_手機開發 Android移動開發教學課程

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


 &nbsp

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *