Динамическое добавление и удаление отображенных кнопок в TableLayout - PullRequest
0 голосов
/ 09 января 2019

Я изо всех сил пытаюсь найти хороший способ добавления и удаления нажимаемых кнопок в TableLayout.

Итак, в настоящее время у меня есть HashMap, который содержит целое число и объект. Он обновляется по мере необходимости. Когда пользователь нажимает кнопку «Добавить проект», я хотел бы, чтобы он прошел через процесс добавления проекта в HashMap, а затем обновил мой TableLayout.

Я бы хотел ограничить каждую строку двумя кнопками. Я заметил, что прежде чем я смогу обновить TableLayout (или любой макет), добавив новый проект, я должен удалить предыдущую итерацию.

Я пробовал множество разных способов добавлять и удалять кнопки подряд, но ни один из них, похоже, не сработал.

One example of what I did is:

int i = mProjectMap.size();
for(Map.Entry<Integer, Counter> entry : mProjectMap.entrySet()) { // This already has one entry before reaching this loop
    if(i % 2 == 0 || mLayoutProjects.getChildCount() == 0) {
        mTableRow = new TableRow(mMainContext);
        mLayoutProjects.addView(mTableRow);
    }

    mTableRow.addView(entry.getValue());
};

As for removing the views I've tried:
mLayoutProjects.removeAllViews();

and:
mLayoutProjects.removeViewsInLayout();

And many more.

Что должно произойти так:

1) Пользователь нажимает кнопку «Добавить проект». 2) Проект наполнен актуальной информацией. (сделанный) 3) Проект добавлен в mProjectMap (готово) 4) В mLayoutProjects удалены все содержащие представления. 5) если mLayoutProjects.getChildCount () равно 0 ИЛИ i% 2 равно 0, то: Создайте новую строку и добавьте ее в mLayoutProjects. 6) Добавьте кнопку проекта в строку.

Вместо этого, когда я нажимаю кнопку «Добавить проект», этот цикл кажется , чтобы добавить все на первой итерации, но на экране ничего не отображается в виде кнопок (у меня есть счетчик проектов, который увеличивается один раз). Затем я снова нажимаю кнопку, и приложение вылетает.

1 Ответ

0 голосов
/ 09 января 2019

Обновление:

Я исправил проблему другим способом. Для тех, кто наткнулся на это, я включу решение для полноты:

Итак, я изменил все на LinearLayout и в функции «addProjectButton» у меня было следующее:

int i = mProjectMap.size();
for(Map.Entry<Integer, Counter> entry : mProjectMap.entrySet()) {
    if((entry.getKey() - 1) % 2 == 0 || mLayoutRow == null) {
        mLayoutRow = new LinearLayout(mMainContext);
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
            LinearLayout.LayoutParams.MATCH_PARENT,
            LinearLayout.LayoutParams.WRAP_CONTENT
        );
        mLayoutRow.setOrientation(LinearLayout.HORIZONTAL);
        mLayoutRow.setGravity(Gravity.CENTER);
        mLayoutRow.setLayoutParams(lp);
        mLayoutProjects.addView(mLayoutRow);
    }

    mLayoutRow.addView(entry.getValue());
}

Затем в моей функции "removeProjectButton":

for(Map.Entry<Integer, Counter> entry : mProjectMap.entrySet()) {
    if(entry.getValue().getParent() != null) {
        ((ViewGroup) entry.getValue().getParent().removeView(entry.getValue());
    }
}

mLayoutRow = null;

Кажется, что все работает прекрасно без каких-либо проблем ... Хотя это может оказаться слишком хорошим, чтобы быть правдой, но только время покажет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...