Удаление элементов из ArrayList<Object> в Android

247
23 марта 2017, 19:28

В Android-приложении у меня реализован функционал по динамическому добавлению textView в linearLayout, и увеличению высоты этого Layout:

final View view2 = getLayoutInflater().inflate(R.layout.strings_layout, null);
                final TextView text = (TextView) view2.findViewById(R.id.txtview);
                text.setText(iing.getName());
                params.height = params.height + layoutpar;
                linear.setLayoutParams(params);
                allEds.add(view2);
                linear.addView(view2);

На каждом textView висит событие text.setOnClickListener(new View.OnClickListener(), в котором одной из операций является операция получения индекса нажатого textView и сохранения всех view, у которых index меньше данного индекса:

int position=allEds.indexOf(view2);
                        for (int k=0; k<allEds.size();k++)
                        {
                            if (position>k)
                            {
                                allEdsdop.add(allEds.get(k));
                            }
                        }

После нажатия на textView, получения индекса нажатого textView и копирования view в другой ListArray, происходит набор операций, среди которых происходит удаление всех view с textView, index которых меньше значения position. Удаление происходит таким способом:

linear.removeAllViews();
                    params.height =0;//обнуляю высоту layout
                    linear.setLayoutParams(params); 
                    allEds=new ArrayList<View>(); //очищаю весь список view
                    allEds=allEdsdop; //присваиваю ему значение сохраненных ранее, у которых index меньше postition
                    for (int k=0; k<allEds.size();k++) //в цикле заново создаю и размещаю textview в layout, и устанавливаю высоту
                    {
                        params.height =params.height+layoutpar;
                        linear.setLayoutParams(params);
                        linear.addView(allEds.get(k));
                    }

И кроме этого, после последнего элемента в списке, создается еще один textView и так далее.

Проблема в том, что после первого удаления, когда весь процесс прошел, на экране остался список textView с index меньше position + новый созданный textview, у ВСЕХ textView, которые не были удалены(с index меньше position) пропадает событие text.setOnClickListener(new View.OnClickListener(). Оно есть только у новых textView, которые создаются после удаления и восстановления старых textView. То бишь при нажатии на эти textView не происходит ничего.

Есть ли способ удаления элементов их ArraList<> без создания копий этого ArrayList<> с view, которые не надо удалять и затем обратного создания всех элементов на экране, чтобы событие setOnClickListener не пропадало у них? Я смотрел, что можно использовать механизм Iterator, но я так и не понял как его использовать в моем случае и как он работает с ArrayList.

Answer 1

Вот способ удаления элементов ArrayList без создания копии элементов и использования Iterator, хитрость в том, чтобы пройтись по листу не с нулевого значения, а с конца, тогда можно построить такой цикл:

for (int i=arrayList.size()-1; i>=0; i--)
{
    if (...) {
      arrayList.remove(i);
    }
}

что позволит удалить нужные значения!

READ ALSO
Android: отслеживание изменения даты

Android: отслеживание изменения даты

Ситуация следующая: есть TextView, текст отличается в зависимости от того, какая дата в системеЯ пытаюсь сделать так, чтобы это изменение происходило...

175
Как удалить значение из поля с помощью Java Reflection

Как удалить значение из поля с помощью Java Reflection

При попыткt установить в поле значение null я получаю ошибку

191
IDEA mysql-connector-java

IDEA mysql-connector-java

Следующий вопрос почему когда в pomxml описана зависимость mysql mysql-connector-java 5

182
Как считать данные из SpreadSheet Google Excel?

Как считать данные из SpreadSheet Google Excel?

Как считать данные из SpreadSheet Google Excel?

224