2013-10-28 138 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,然后使其发生。也尝试将您的代码稍后发布到您之前的工作中,这可能有助于我们判断问题的实际情况。