2015-04-22 58 views
0

我正在關注this庫以添加拖放功能我的列表視圖。將第一項移動到第二位時一切都很好。但是當我將listview第一個元素移動到第三個應用程序崩潰時。爲了解釋我的情況,我添加了圖像。我認爲這是交換項目線引起的,但我認爲我的代碼是正確的。當我嘗試將第一項替換爲第三項時,應用程序崩潰。任何幫助對我來說都是有價值的。感謝您的幫助。在ListView中拖放和重新排序元素

enter image description here

這裏是我的適配器代碼。

public class NavigationDrawerListViewAdapter extends BaseAdapter implements Communicator,Swappable{ 

    private LayoutInflater mInflater; 
    public ArrayList<NavigationDrawerFragment.ListItem> myItems; 



    public NavigationDrawerListViewAdapter(Context activity, ArrayList<NavigationDrawerFragment.ListItem> listItemElements) { 
     mInflater = (LayoutInflater) activity.getSystemService(
       Context.LAYOUT_INFLATER_SERVICE); 
     myItems = listItemElements; 

    } 


    @Override 
    public int getCount() { 
     return myItems.size(); 
    } 

    @Override 
    public NavigationDrawerFragment.ListItem getItem(int position) { 
     return myItems.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return myItems.get(position).hashCode(); 
    } 

    @Override 
    public boolean hasStableIds(){ 
     return true; 
    } 

    @Override 
    public View getView(final int position, View convertView, final ViewGroup parent) { 
     View v = convertView; 
     final ViewHolder holder; 
     final NavigationDrawerFragment.ListItem i = myItems.get(position); 
     if (i != null) { 
       holder = new ViewHolder(); 
       convertView = mInflater.inflate(R.layout.navigation_drawer_listview_simple, null); 
       holder.text = (TextView) convertView.findViewById(R.id.textView123); 
       holder.text.setText(i.textdata); 
       convertView.setTag(holder); 
       parent.setTag(holder); 
       holder.text.setTag(position); 


     } 
     return convertView; 
    } 

    @Override 
    public void respond(String name) { 

    } 

    @Override 
    public void sendData(String url, String type) { 

    } 

    @Override 
    public void sendMapValues(Geometry featureGeometry, Symbol featureSymbol, Object featureAttrValues) { 
      //doinNothing 
    } 

    @Override 
    public void swapItems(int i, int i2) { 

     NavigationDrawerFragment.ListItem obj1 = myItems.get(i); 
     myItems.remove(i); 
     myItems.add(i2,obj1); 
     this.notifyDataSetChanged(); 

    } 


    class ViewHolder { 
     TextView text; 
    } 

} 
+1

由於應用程序崩潰,請顯示logcat錯誤消息。這將幫助我們看到堆棧跟蹤。 –

回答

2

我認爲你的代碼不斷地將第一個項目添加到第二個位置,但第二個項目被刪除。這發生在ArrayList內部,而不是在GUI中。

我建議一種技術,只是交換兩個項目,基本交換使用臨時對象。這次temp是obj1。使用你的風格 示例代碼:

public void swapItems(int i, int i2) { 
    NavigationDrawerFragment.ListItem obj1 = myItems.get(i); 
    myItems.set(i, myItems.get(i2); 
    myItems.set(i2, obj1); 
} 

注:我使用的是ArrayList的設置方法而不是加()。