2012-05-23 11 views
5

मैं एक सूची दृश्य बनाने की कोशिश कर रहा हूं जिसे मैं ड्रैग और ड्रॉप का उपयोग करके सॉर्ट कर सकता हूं।एंड्रॉइड लिस्ट व्यू हनीकॉम और आईसीएस के लिए ड्रैग और ड्रॉप "त्रुटि: रिपोर्टिंग ड्रॉप रिपोर्ट: झूठी"

मैंने एंड्रॉइड गाइड here और here पर गिट पर प्रदान किए गए कुछ स्रोत कोड का पालन करने का प्रयास किया है। साथ ही, मैं संगीत ऐप उदाहरण का उपयोग नहीं करना चाहता क्योंकि मैं हनीकॉम और ऊपर दिए गए नए टूल का उपयोग करने की कोशिश कर रहा हूं।

अब तक मैं सूची बनाने में सफल रहा हूं और मैं आइटम खींच सकता हूं। दुर्भाग्यवश जब मैं आइटम को सूची में छोड़ देता हूं तो मुझे निम्न त्रुटि मिलती है:

"I/ViewRoot (22739): रिपोर्ट परिणाम ड्रॉप: झूठी"।

मुझे संदेह है कि मेरा ड्रॉप श्रोता सही आइटम पर नहीं बनाया गया है और इस प्रकार ड्रॉप को कभी भी बुलाया नहीं जाता है। यहां कुछ स्रोत कोड है, आपकी मदद के लिए बहुत बहुत धन्यवाद। सूची के लिए

एक्सएमएल:

<?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> 

मेरे ListView: मैं अभी तक तो यह है कि कोड का परीक्षण नहीं किया गया है "ACTION_DROP" घटना में प्राप्त करने में सक्षम नहीं किया गया है। बस कुछ मैं काम कर रहा था। मेरा मुख्य सवाल यह है कि मैं कभी भी ACTION_DROP में नहीं जाता हूं।

public class procedureListView extends ListActivity { 
    private ListView mListView = null; 
    private ArrayAdapter<String> mArrayAdapter = null; 
    private View layoutDropArea = null; 

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

      String[] countries = getResources().getStringArray(R.array.arrayOfStuff); 
      mArrayAdapter = new ArrayAdapter<String>(this, R.layout.list_item, countries); 
      setListAdapter(mArrayAdapter); 

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

      layoutDropArea = findViewById(R.id.dropTarget); 

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

     layoutDropArea.setOnDragListener(mDragListener); 



    } 
    protected class myDragListener 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); 
        break; 
       case DragEvent.ACTION_DRAG_EXITED: 
        v.setBackgroundColor(Color.TRANSPARENT); 
        break; 
       case DragEvent.ACTION_DRAG_STARTED: 
        break; 
       case DragEvent.ACTION_DRAG_LOCATION: 
        v.setVisibility(View.VISIBLE); 
       // return processDragStarted(event); 
       case DragEvent.ACTION_DROP: 
        v.setBackgroundColor(Color.TRANSPARENT); 
        int newPosition = mListView.getPositionForView(v); 
        if (newPosition != ListView.INVALID_POSITION) 
         return processDrop(event, newPosition); 
        else 
         return false; 
      } 
      return false; 
     } 

    } 

    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); 
     mArrayAdapter.insert(listItem, index); 
     mArrayAdapter.notifyDataSetChanged(); 
    } 
    private boolean processDragStarted(DragEvent event) { 
     ClipDescription clipDesc = event.getClipDescription(); 
     if (clipDesc != null) { 
      return clipDesc.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN); 
     } 
     return false; 
    } 
} 

आपकी मदद के लिए बहुत बहुत धन्यवाद!

अद्यतन:

मैं काफी क्यों समझ नहीं सकता है। लेकिन जब मैं यह करने के लिए मामले स्विच बदल गया है, यह काम करने के लिए लग रहा था:

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 = mListView.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; 

      } 

उत्तर

5

आपका अद्यतन समस्या ठीक हो गई है क्योंकि आप onDrag से true वापस जाने के लिए जब आप आदेश है कि श्रोता के लिए ड्रैग घटनाओं प्राप्ति करते रहने के DragEvent.ACTION_DRAG_STARTED प्राप्त की है। इस मामले के लिए आप अपने अपडेट में true लौटते हैं, इसलिए आप ड्रैग इवेंट प्राप्त करना जारी रखते हैं और ड्रॉप लॉजिक सही ढंग से काम करता है।

यदि आप DragEvent.ACTION_DRAG_STARTED मामले के लिए true वापस नहीं करते हैं, तो आपके श्रोता को DragEvent.ACTION_DRAG_ENDED को छोड़कर कोई अन्य ईवेंट नहीं मिलेगा।

संबंधित मुद्दे