动态添加和删除映射到TableLayout的按钮

时间:2019-01-09 00:09:46

标签: java android android-studio

我正在努力寻找一种在TableLayout中添加和删除可点击按钮的好方法。

所以我目前有一个HashMap,其中包含一个整数和一个对象。它也会根据用户需要进行更新。当用户按下“添加项目”按钮时,我希望它完成将项目添加到HashMap然后更新我的TableLayout的动作。

我想将每行限制为2个按钮。我注意到,在我可以使用添加的新项目更新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 :(得分:1)

更新:

我用另一种方式解决了这个问题。对于那些迷迷糊糊的人,我将提供完整性解决方案:

因此,我将所有内容都更改为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;

这似乎运行得很好,没有任何问题...虽然它最终可能会变得太好了,无法实现,但是只有时间才能证明一切。