2013-10-28 88 views
3

我有一個列表視圖顯示一些數據。現在我想在此列表視圖中包含拖放項目的功能。我的意思是我想將項目從1級拖到3級,依此類推......拖放ListView無庫

我得到了一些拖放listview的例子,但它們都指的是外部庫。我只需要使用官方的SDK,我知道拖放是可用的,因爲Android 3.0。

我試圖構建它我自己,但它不適合我...大多數與此功能(從Android 3.0拖放)的教程是關於拖放視圖,而不是列表中的項目。

編輯:我不需要庫,因爲自從Honeycomb在android上有一個功能來拖放視圖,並且我想用它來顯示項目。列表中的級別平均位置。 這裏是我的代碼:

MainActivity.java:

public class MainActivity extends ListActivity { 
private ListView lvSort = null; 
private ArrayAdapter<String> sortAdapter = null; 
private View layoutDropArea = null; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    String[] sortCategories = {"time", "service", "equipment", "type", "alert", "system", "priority"}; 
    sortAdapter = new ArrayAdapter<String>(this, R.layout.list_item,R.id.textView1, 
      sortCategories); 
    setListAdapter(sortAdapter); 

    lvSort = getListView(); 
    lvSort.setTextFilterEnabled(true); 

    layoutDropArea = findViewById(R.id.dropTarget); 

    setupDragDrop(); 
} 

/** 
* Setup what to do when we drag list items 
*/ 
public void setupDragDrop() { 
    lvSort.setOnItemLongClickListener(new OnItemLongClickListener() { 
     public boolean onItemLongClick(AdapterView<?> arg0, View v, 
       int position, long arg3) { 
      TextView txtview = (TextView)v.findViewById(R.id.textView1); 
      String value = txtview.toString(); 
      ClipData data = ClipData.newPlainText("procedure", value); 
      v.startDrag(data, new DragShadowBuilder(v), null, 0);//!! 
      return true; 
     } 
    }); 
    DragListener mDragListener = new DragListener(); 
    // mListView.setOnDragListener(mDragListener); 

    layoutDropArea.setOnDragListener(mDragListener); 

} 
private boolean processDrop(DragEvent event, int newPosition) { 
    ClipData data = event.getClipData(); 
    if (data != null) { 
     if (data.getItemCount() > 0) { 
      Item item = data.getItemAt(0); 
      String value = item.toString(); 
      updateViewsAfterDropComplete(value, newPosition); 
      return true; 
     } 
    } 
    return false; 
} 

private void updateViewsAfterDropComplete(String listItem, int index) { 
    Log.d("InsertItem", "Position: " + index); 
    sortAdapter.insert(listItem, index); 
    sortAdapter.notifyDataSetChanged(); 
} 

private boolean processDragStarted(DragEvent event) { 
    ClipDescription clipDesc = event.getClipDescription(); 
    if (clipDesc != null) { 
     return clipDesc.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN); 
    } 
    return false; 
} 
protected class DragListener implements OnDragListener { 

    public boolean onDrag(View v, DragEvent event) { 
     final int action = event.getAction(); 
     switch (action) { 
     case DragEvent.ACTION_DRAG_ENTERED: 
      // v.setBackgroundColor(Color.GRAY); 
      return false; 

     case DragEvent.ACTION_DRAG_EXITED: 
      // v.setBackgroundColor(Color.TRANSPARENT); 
      return true; 

     case DragEvent.ACTION_DRAG_STARTED: 
      return true; 

     case DragEvent.ACTION_DRAG_LOCATION: 
      // v.setVisibility(View.VISIBLE); 
      //return false; 
      return processDragStarted(event); 
     case DragEvent.ACTION_DROP: 
      v.setBackgroundColor(Color.TRANSPARENT); 
      int newPosition = lvSort.pointToPosition(
        (int) (event.getX()), (int) event.getY()); 
      Log.d("Position", Integer.toString(newPosition)); 
      if (newPosition != ListView.INVALID_POSITION) 
       return processDrop(event, newPosition); 
      else 
       return false; 
     default: 
      return true; 

     } 
    } 

} 
} 

activity_main.xml中:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/dropTarget" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:layout_weight="1"> 
<ListView 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@android:id/list" > 
</ListView> 
</LinearLayout> 

list_item.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<TextView 
    android:id="@+id/textView1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="TextView" /> 

</LinearLayout> 

通常情況下,我可以拖移項目列表視圖並將它們放在想要的位置,但是當我長時間點擊時,我遇到了一個問題在一個項目上,我有這個異常:com.example.dragdrop.MainActivity.updateViewsAfterDropComplete(MainActivity.java:77)的java.lang.UnsupportedOperationException

此行對應於以下內容:「sortAdapter.insert(listItem,index );」

請幫助一些線索。

感謝&問候

回答

2

適配器採取陣列並修復它。該數組在Java中是不可變的,所以在插入過程中有一個UnsuportedOperationException。

當我使用一個列表,異常已解決,但有很多錯誤,拖放事件。我看到谷歌在2013年8月做了一個關於拖放列表的教程。他們不使用他們自己的框架......我認爲這不適合列表。我發佈鏈接,如果有人感興趣:

Drag and drop tutorial

0

你總是可以創建自定義視圖。並以你想要的方式拖放它們。在你的問題中,似乎你根本不想使用外部庫。因此,請嘗試在自定義視圖中創建您稱爲「級別2」「級別3」的things,然後使其發生。也嘗試將您的代碼稍後發佈到您之前的工作中,這可能有助於我們判斷問題的實際情況。