我正在努力寻找一种在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)在行中添加一个项目按钮。
相反,当我按下“添加项目”按钮时,该循环似乎在第一次迭代中添加了所有内容,但是屏幕上没有显示任何按钮(我有一个项目计数器,递增一次)。然后,我再次按下按钮,应用程序崩溃了。
答案 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;
这似乎运行得很好,没有任何问题...虽然它最终可能会变得太好了,无法实现,但是只有时间才能证明一切。