Как удалить программно созданный 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