2012-08-03 20 views
1

我創建了一個ListView,每行都有一個帶有向上和向下箭頭的按鈕。按下這些按鈕可以將該行向上或向下移動一個位置。在ArrayAdapter中交換兩行

我已經通過在覆蓋方法getView中實現兩個按鈕的OnClickListener來實現它。它的工作原理應該如此,但我填寫糟糕的是,這似乎是高度消耗內存,許多代碼翻了一番。

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    View rowView = inflater.inflate(R.layout.row_layout, parent, false); 

    TextView textView = (TextView) rowView.findViewById(R.id.label); 
    CheckBox checkBox = (CheckBox) rowView.findViewById(R.id.checkbox); 
    checkBoxes.add(position, checkBox); 

    String address = this.getItem(position).getAddress(); 
    String tokenizedAddress = tokenizeAddress(address); 

    textView.setText(tokenizedAddress); 

    ImageButton buttonUp = (ImageButton)rowView.findViewById(R.id.button_up); 
    ImageButton buttonDown = (ImageButton)rowView.findViewById(R.id.button_down); 

    buttonUp.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      ListAdapter adapter = ListAdapter.this; 

      if(position != 0){ 
       GameTask current = adapter.getItem(position); 

       ArrayList<GameTask> list = new ArrayList<GameTask>(); 
       for(int i = 0; i < adapter.getCount(); i++) 
        list.add(adapter.getItem(i)); 
       list.remove(position); 
       list.add(position-1, current); 
       adapter.clear(); 
       for(int i = 0; i < list.size(); i++){ 
        adapter.add(list.get(i)); 
       } 
       adapter.notifyDataSetChanged(); 
      } 

     } 
    }); 

    buttonDown.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      ListAdapter adapter = ListAdapter.this; 

      if(position != adapter.getCount()-1){ 
       GameTask current = adapter.getItem(position); 

       ArrayList<GameTask> list = new ArrayList<GameTask>(); 
       for(int i = 0; i < adapter.getCount(); i++) 
        list.add(adapter.getItem(i)); 
       list.remove(position); 
       list.add(position+1, current); 
       adapter.clear(); 
       for(int i = 0; i < list.size(); i++){ 
        adapter.add(list.get(i)); 
       } 
       adapter.notifyDataSetChanged(); 
      } 

     } 
    }); 


    return rowView; 
} 

兩個聽衆都做幾乎相同,唯一的區別是條件和移動+ 1/-1的值。我想知道如何在擴展的ArrayAdapter類中創建實現OnClickListener的內部類,但是我不知道如何通過點擊到這個內部類的行的位置。

回答

1

您可以製作一個方法,可以使用buttonUpbuttonDown。此方法可以將按下的操作類型(UP/DOWN)和項目在ListView中的位置作爲參數,然後在您的兩個單擊偵聽器中傳遞適當操作調用此方法。

實施例:

// 2 new constants 
private static final int UP = 0; 
private static final int DOWN = 1; 

// Based on "type", increment or decrement the position. 

private void changeRow(int type, int position){ 
     if(type==UP){ 
       position=position-1; 
     }else if(type==DOWN){ 
       position=position+1; 
     } 

     // ........ 

     // Then in your "for" cicle you specify: 
     list.add(position, current); 

     // ........ 
} 

然後在buttonUp所述的onClick()方法指定:

changeRow(UP, position); 

buttonDown

changeRow(DOWN, position); 
1

這可以容易地實現

做到這一點的方法是存儲要顯示在List

的數據。然後,當用戶點擊向上或向下箭頭

互換使用Collections.swap(List, int, int)

被移動位置數據項的引用

然後在適配器上調用notifyDataSetChanged

+0

好的,感謝這裏的所有答案。他們真的很有幫助。但是告訴我,是否可以創建一個靜態的偵聽器,通知被點擊的行的位置?而不是每行2個監聽器。或者它不那麼記憶和耗時,我不應該打擾? – Nav 2012-08-03 11:14:38

+0

我認爲你不應該打擾,但如果你認爲它可能是一個瓶頸配置它肯定。 – Gautam 2012-08-03 11:18:05