Как удалить программно созданный View?

Хочу сделать приложение "список покупок". При нажатии на кнопку "Добавить" в LinearLayout добавляю новый LinearLayout с текстом(EditText) (название покупки) и кнопкой "Del":

LinearLayout.LayoutParams lParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
LinearLayout.LayoutParams lParamsBtn = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
LinearLayout.LayoutParams lParamsItem = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);

LinearLayout llItem = new LinearLayout(this);
llItem.setOrientation(LinearLayout.HORIZONTAL);

EditText etItem = new EditText(this);
etItem.setText(etTitle.getText().toString());
etItem.setBackgroundColor(Color.TRANSPARENT);

llItem.addView(etItem,lParams);

Button btnDelete = new Button(this);
lParamsBtn.gravity = Gravity.RIGHT;
btnDelete.setText("Del");
btnDelete.setOnClickListener(this);
llItem.addView(btnDelete,lParamsBtn);

llList.addView(llItem,lParamsItem);

Но я не знаю, как удалить теперь эти элементы при нажатии кнопки Del. Ведь при создании элементов я не задавала ID и, как я поняла, ID можно задать только целочисленным. И нужно кнопки Del тоже отличать одну от другой. Подскажите пожалуйста, как это лучше реализовать. В крайнем случае можно было бы задавать целым числом(по-моему, я видела метод для удаления по ID), но мне кажется, это неправильно.


Ответы (1 шт):

Автор решения: Вася Воронцов

Кнопку вы добавляете прямо в элемент списка, поэтому будет нетрудно получить родительский вид кнопки и удалить его. Судя по фрагменту вашего кода, класс реализует интерфейс View.OnClickListener, поэтому добавьте в метод onClick несколько строк:

@Override
public void onClick(View v) {
    View item = v.getParent(); //элемент списка - родительский вид по отношению к кнопке
    ViewGroup list = (ViewGroup) item.getParent(); //список, он же llList
    list.removeView(item); //удаляем элемент списка
}

Таким образом, вам не нужно будет хранить никакой информации об элементе, который вы собираетесь удалить, её можно получить от кнопки.

UPD

Используйте ArrayList и View.indexOfChild:

ArrayList<String> data = new ArrayList<String>(); //объявление и инициализация
/*
*
*
*/
LinearLayout.LayoutParams lParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
LinearLayout.LayoutParams lParamsBtn = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
LinearLayout.LayoutParams lParamsItem = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);

LinearLayout llItem = new LinearLayout(this);
llItem.setOrientation(LinearLayout.HORIZONTAL);

EditText etItem = new EditText(this);
etItem.setText(etTitle.getText().toString());
etItem.setBackgroundColor(Color.TRANSPARENT);

llItem.addView(etItem,lParams);

Button btnDelete = new Button(this);
lParamsBtn.gravity = Gravity.RIGHT;
btnDelete.setText("Del");
btnDelete.setOnClickListener(this);
llItem.addView(btnDelete,lParamsBtn);

llList.addView(llItem,lParamsItem);

//!!!!!!!!!!!!!!!!Добавляем данные
data.add(""MyDataString);
@Override
public void onClick(View v) {
    View item = v.getParent(); //элемент списка - родительский вид по отношению к кнопке
    ViewGroup list = (ViewGroup) item.getParent(); //список, он же llList

    data.remove(list.indexOfChild(item)); //удаляем данные
    list.removeView(item); //удаляем элемент списка
}

Однако этот способ требует, чтобы в списке llList находились только те элементы, которым соответствуют данные в списочном массиве data

→ Ссылка