我创建了一个ListView,每行都有一个带向上和向下箭头的按钮。按下这些按钮可使行向上或向下移动一个位置。
我通过在覆盖方法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的内部类,但是我不知道如何将单击的行的位置传递给这个内部类。
答案 0 :(得分:2)
除了在ArrayList中添加和删除元素之外,您可以更好地实现Collections.swap(List list, int firstElementIndex, int secondElementIndex)
,因为您不必遍历整个Collection,这样会更容易。可以找到相同的简单示例here
。
答案 1 :(得分:1)
您可以创建一个供buttonUp
和buttonDown
使用的方法。此方法可以将按下的动作类型(向上/向下)和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);
答案 2 :(得分:1)
这很容易实现
执行此操作的方法是将要显示的数据存储在List
然后当用户点击向上或向下箭头时
使用Collections.swap(List, int, int)
然后在适配器上调用notifyDataSetChanged