Программно добавлять / удалять элементы в / из настраиваемого списка?

Я создаю настраиваемое представление списка, в котором можно добавлять или удалять элементы. Я пробую этот код добавить новый элемент строки в представление списка, но он говорит: «Метод add (String) не определен для типа ListView».

Это мой код:

public class AddActivityCustomList extends ArrayAdapter<String> {

    private final Activity context;
    private final String[] web;

    public AddActivityCustomList(Activity context, String[] web) {
        super(context, R.layout.add_activity_single_list, web);
        this.context = context;
        this.web = web;

    }

    public View getView(final int position, View view, ViewGroup parent) {
        LayoutInflater inflater = context.getLayoutInflater();
        View rowView = inflater.inflate(R.layout.add_activity_single_list,
                null, true);
        TextView txtTitle = (TextView) rowView
                .findViewById(R.id.act_title_single);

        txtTitle.setTypeface(myface);
        txtTitle.setText(web[position]);

        return rowView;

    }

И мой код кнопки добавления таков:

add_activity.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                lv.add(add_act_title.getText().toString());
                add_act_title.setText("");
                adapter.notifyDataSetChanged();
                add_act_title.getText();
            }
        });

у которого есть проблема в lv.add(...part. Что мне делать?


person Mohammad    schedule 02.02.2015    source источник


Ответы (4)


В списке отображаются данные от адаптера. Добавьте новую строку в адаптер с помощью функции добавления.

person bryan    schedule 02.02.2015
comment
Измените lv.add (add_act_title.getText (). ToString ()); в адаптер.add (add_act_title.getText (). toString ()); - person bryan; 02.02.2015

Вы не можете добавлять данные непосредственно в список. Вам нужно добавить данные в адаптер и вызвать notifyDataSetChanged()

Использовать это

@Override
public void onClick(View arg0) {
    // TODO Auto-generated method stub
    adapter.add(add_act_title.getText().toString());
    adapter.notifyDataSetChanged();
    add_act_title.setText("");
    add_act_title.getText();
}
person Rohit5k2    schedule 02.02.2015
comment
если вы вызываете .add на адаптере массива, вам не нужно вызывать notifyDataSetChanged. - person petey; 02.02.2015

«Метод add (String) не определен для типа ListView»

Потому что вы вызываете метод add в ListView вместо адаптера.

Как добавить новый элемент строки в список

Чтобы добавить / удалить элемент из ListView, используйте ArrayList в качестве источника данных вместо Array, потому что, если вы используете Array и вызываете метод адаптера add, вы получите UnsupportedOperationException.

Поэтому внесите следующие изменения в AddActivityCustomList Адаптер:

1. Используйте ArrayList<String> вместо String[] Array.

2. Добавьте новый элемент в адаптер как:

AddActivityCustomList adapter=listView.getAdapter();
adapter.add(add_act_title.getText().toString());
adapter.notifyDataSetChanged();
person ρяσѕρєя K    schedule 02.02.2015
comment
Я просто использую ArrayAdapter ‹String› в AddActivityCustomList. Вы говорите, что я должен использовать ArrayList insted? - person Mohammad; 02.02.2015
comment
@Mohammad: да, причина в том, что вы нет, когда создается массив, тогда невозможно изменить его размер, поэтому, когда мы вызываем Adapter.add, это означает, что мы пытаемся добавить новый элемент в массив, но размер массива уже фиксирован. поэтому вам нужна некоторая структура данных, которая динамически растет, как ArrayList - person ρяσѕρєя K; 02.02.2015
comment
вызов .add в ArrayAdapter также вызовет notifyDataSetChanged. Не надо называть это самим, - person petey; 02.02.2015
comment
Чтобы добавить / удалить элемент из ListView, используйте ArrayList в качестве источника данных вместо Array, потому что если вы используете Array и вызываете метод добавления адаптера, вы получите исключение UnsupportedOperationException. Это неверно, конструктор, использующий массив, преобразует массив в список за вас - person petey; 02.02.2015
comment
@petey: и если вы просто погуглите UnsupportedOperationException, вы получите много сообщений о stackoverflow, связанных с ArrayAdapter - person ρяσѕρєя K; 02.02.2015
comment
в этом примере (в котором отсутствует значительная часть кода) OP использует CharSequence для поддержки своих данных. однако совершенно неизвестно, добавляют ли они объект String или CharSequence. Использование добавления (StringObject) в этом случае приведет к исключению UnsupportedOperationException, поскольку строки и CharSequence различны. - person petey; 02.02.2015
comment
@petey: Где OP использует CharSequence? я не могу видеть - person ρяσѕρєя K; 02.02.2015
comment
в вашей первой ссылке вопрос id = 3476723 - person petey; 02.02.2015
comment
@petey: Хм, это просто пример во втором, как OP, используя также массив типа String - person ρяσѕρєя K; 02.02.2015
comment
@petey: я не говорю, что ваш ответ неверен, потому что вы указали еще одну точку, которая позволит избежать одного ненужного вызова метода (который не связан с вопросом OP, который задает OP), но почему вы отрицаете мой ответ - person ρяσѕρєя K; 02.02.2015
comment
честно, пожалуйста, отредактируйте свой ответ немного, чтобы я мог убрать -1, & ty - person petey; 02.02.2015
comment
@petey: я не говорю, что вы удаляете -1. Дело в том, что когда кто-то отвечает, сначала нужно понять, что он хочет сказать, а не просто начинать отрицательное голосование. - person ρяσѕρєя K; 02.02.2015

person    schedule
comment
по-прежнему есть ошибка в этой строке: adapter.add (add_act_title.getText (). toString ()); . Я думаю, мне следует изменить свой AddActivityCustomList, не так ли? - person Mohammad; 03.02.2015