我创建了一个ListView,在每一行中都有一个带有UP和DOWN箭头的按钮。按下这些按钮可使该行上移或下移一个位置。

我通过在重写方法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的内部类,但是我不知道如何将单击的行的位置传递给该内部类。

最佳答案

您可以更好地实现Collections.swap(List list, int firstElementIndex, int secondElementIndex),而不是从ArrayList中添加和删除元素,因为不必遍历整个Collection,因此会容易得多。一个简单的例子可以在here中找到。

关于android - 在ArrayAdapter中交换两行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11793935/

10-12 02:46