Удаление View полученных через LayoutInflater

105
19 марта 2021, 15:00

В моем приложении есть 2 активити, в каждом из которых я создаю список из View полученных через LayoutInflater. При создании каждого view-пункта списка я регистрирую его для вызова контекстного меню которое дает возможность удалять пункт списка. В MainActivity я могу удалять пункт списка из слушателя нажатий просто получив id пункта для которого вызвано контекстное меню, id я самостоятельно не задаю. Но для второго активити попытка сделать тоже самое не убирает пункт списка с экрана(если назначать каждому пункту списка при создании id методом setId() все работает). Почему такой подход работает только для MainActivity?

Код MainActivity:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo info){
    menu.add(1,0,0,"Change state");
    menu.add(1,1,1,"Delete");
    currentViewId = v.getId();
    super.onCreateContextMenu(menu, v, info);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case 1:
            RelativeLayout rl1 = (RelativeLayout)findViewById(currentViewId);
            long primaryKey2 = Long.parseLong(((TextView)rl1.findViewById(R.id.tvId)).getText().toString());
            llMain.removeView(rl1);
            mDB.close();
            break;
    }
    return true;
}

Неработающий аналог другого активити:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo info){
    menu.add(1,0,0,"Change amount");
    menu.add(1,1,1,"Delete");
    currentViewId = v.getId();
    super.onCreateContextMenu(menu, v, info);
}
@Override
public boolean onContextItemSelected(MenuItem item) {
    switch (item.getItemId()){
        case 0:
            Intent intent0 = new Intent(this,AmountChooser.class);
            startActivityForResult(intent0,SET_AMOUNT_FROM_CONTEXT_MENU);
            break;
        case 1:
            LinearLayout ll = (LinearLayout)findViewById(currentViewId);
            for(int b=0;b<counter;b++){
                if(orders[b][2] == currentViewId){
                    for(int k=b+1; k<=counter;k++){
                        orders[k-1][0] = orders[k][0];
                        orders[k-1][1] = orders[k][1];
                        orders[k-1][2] = orders[k][2];
                    }
                    counter--;
                    break;
                }
            }
            llOrder.removeView(ll);
            break;
    }
    return true;
}
Answer 1

Если вы создали View через LayoutInflater, то он не имеет id, точнее его id = -1. Когда вы вызываете findViewById(-1), то получаете null. removeView(null) ничего не делает, и судя по коду, который можно посмотреть зажав ctrl и кликов пометоду, никаких исключений не выбрасывается. Не совсем понимаю на что вы вообще рассчитывали, ища объект по id, который не задан. Что он выдается рандомный? Увы, слишком дорогая операция, ведь это ж надо убедится что такого id еще нигде не было в программе, потому просто ввели NO_ID = -1

Итого ответ на ваш вопрос есть в вашем же вопросе - чтобы все работало, нужно задавать id через setID

READ ALSO
Создать систему лицензирования [закрыт]

Создать систему лицензирования [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме

92
Не могу достучаться до приложения

Не могу достучаться до приложения

Написал веб приложение на spring bootЧерез Intelij Idea (встроеный в spring boot tomcat) все запускается и работает

118
Неправильная работа фильтра на сайте

Неправильная работа фильтра на сайте

У меня такая проблема, сделал свой первый сайт ves-shinyru, и как недавно выяснил сделал не так как хотел

110