2013-05-10 86 views
2

我幾乎沒有使用android的經驗。拖放列表視圖

我試圖做一個拖動+拖放感知列表視圖,因爲各種其他解決方案不做客戶需要的東西,這個項目可能會讓我做很多其他「有趣」的拖拽這樣的事情有一段時間很滑稽。

需求很簡單:用戶可以使用android drag + drop API(如果你稱之爲)將列表中的東西從列表中拖出來並拖入其他東西。只要所說的東西不在列表視圖中或者截取長按或其他東西,它就會工作。

這裏是不是到目前爲止的工作:

package blah; 

import android.os.*; 
import android.app.*; 
import android.content.*; 
import android.util.*; 
import android.view.*; 
import android.view.View*; 
import android.widget.*; 

public class ListFragment extends Fragment 
{ 
    public static class ItemView extends TextView 
    { 
     public int position; 

     public ItemView(Context context, AttributeSet attrs) 
     { 
      super(context,attrs); 
     } 
    } 

    private class _Adapter extends BaseAdapter 
    { 
     private Activity _activity; 

     @Override 
     public int getCount() 
     { 
      // TEST: Make it go 
      return 16; 
     } 

     @Override 
     public Object getItem(int arg0) 
     { 
      return null; 
     } 

     @Override 
     public long getItemId(int arg0) 
     { 
      return 0; 
     } 

     @Override 
     public View getView(int position, View convert, ViewGroup parent) 
     { 
      LayoutInflater inflater = (LayoutInflater)this._activity.getSystemService(
        Context.LAYOUT_INFLATER_SERVICE 
        ); 

      ItemView itemView = (ItemView)inflater.inflate(R.layout.list_item_view,parent,false); 

      // TEST: Just display positions 
      itemView.setText(Integer.toString(position)); 

      itemView.setOnClickListener(new _ItemClickListener()); 

      itemView.setOnDragListener(new _ItemDragListener()); 

      itemView.position = position; 

      return itemView; 
     }; 

     public _Adapter(Activity activity) 
     { 
      this._activity = activity; 
     } 
    } 

    private class _ItemDragListener implements OnDragListener 
    { 
     @Override 
     public boolean onDrag(View view, DragEvent event) 
     { 
      ItemView targetItemView = (ItemView)view; 

      int action = event.getAction(); 

      switch(action){ 
      case DragEvent.ACTION_DROP: 
       { 
        // not really sure which is which here, since nothing works 
        ItemView sourceItemView = (ItemView)event.getLocalState(); 

        Log.d("DERP", 
          "DROPPED " + Integer.toString(sourceItemView.position) + 
          " ONTO " + Integer.toString(targetItemView.position) 
          ); 
       }break; 
      } 
      return true; 
     } 
    } 

    private class _ItemClickListener implements OnClickListener 
    { 
     @Override 
     public void onClick(View view) 
     { 
      ItemView itemView = (ItemView)view; 
      Log.d("DERP", Integer.toString(itemView.position) + " WAS CLICKED"); 

      // nothing happens here 
      view.startDrag(
       ClipData.newPlainText("",""), 
       new View.DragShadowBuilder(view), 
       view, 
       0 
       ); 
     } 

     public _ItemClickListener() 
     { 
     } 
    } 

    private Activity _activity; 

    @Override 
    public void onAttach(Activity activity) 
    { 
     super.onAttach(activity); 
     this._activity = activity; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
    { 
     ListView listView = (ListView)inflater.inflate(R.layout.list_fragment, container, false); 

     listView.setAdapter(new _Adapter(this._activity)); 

     return listView; 
    } 
} 

我的直覺告訴我,做一拖+下拉列表應該比這個更簡單,考慮到由機器人UI支持的功能「廣度」。但是,這也是Java,所以我不期待直接的答案。

回答

0

有一個庫調用drag-sort listview。你應該檢查一下。

+0

Commonsguy也有一個:https://github.com/commonsguy/cwac-touchlist – FoamyGuy 2013-05-10 03:44:16