2012-08-03 71 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