ListAdapter для изменения источника данных (который является массивом) - PullRequest
2 голосов
/ 29 апреля 2010

вот проблема, с которой я столкнулся в последнее время: У меня есть представление списка с пользовательским классом адаптера, адаптер принимает представление списка и заполняет представление списка элементами из него. Теперь я хотел бы иметь кнопку в каждой строке списка, чтобы удалить элемент из него. Как мне подойти к этой проблеме? Есть ли способ удаленного запуска метода в классе активности и вызова метода notifydatachanged () на адаптере для обновления просмотра списка?

Ответы [ 2 ]

1 голос
/ 29 апреля 2010

Я сделал что-то подобное:

public class MyAdapter extends Adapter {

private final ArrayList<String> items = new ArrayList<String>();

// ...

deleteRow(int position) {
    items.remove(position);
    notifyDataSetChanged();
}
//

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

    if(convertView == null) {
        Tag tag = new Tag();
        // inflate as usual, store references to widgets in the tag
        tag.button.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
                    deleteRow(position);
        }
    });
    }
    // don't forget to set the actual position for each row
    Tag tag = (Tag)convertView.getTag();
    // ...
    tag.position = position;
    // ...
}



class Tag {

    int position;

    TextView text1;
    // ...
    Button button;
}

}
0 голосов
/ 29 апреля 2010

В методе getView () нельзя просто установить setOnClickListener () на кнопку?

Примерно так:

static final class MyAdapter extends BaseAdapter {

    /** override other methods here */

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

        if (convertView == null) {
            // inflate the view for row from xml file

            // keep a reference to each widget on the row.
            // here I only care about the button
            holder = new ViewHolder();
            holder.mButton = (Button)convertView.findViewById(R.id.button);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder)convertView.getTag();
        }

        // redefine the action for the button corresponding to the row
        holder.mButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // do something depending on position
                performSomeAction(position);
                // mark data as changed
                MyAdapter.this.notifyDatasetChanged();
            }
        }
    }
    static final class ViewHolder {
        // references to widgets
        Button mButton;
    }
}

Если вы не уверены в расширении BaseAdapter, посмотрите пример List14 в ApiDemos. Этот метод предоставляет вам гибкий способ изменить практически любой аспект вашего адаптера, хотя это довольно трудоемкая работа.

...