我有一个如下所示的布局:
ALTER TABLE GB
ADD COLUMN spread INT;
UPDATE GB
SET spread = (home_score-away_score)
WHERE GB.team = GB.home;
UPDATE GB
SET spread = (away_score-team_score)
WHERE GB.team = GB.away;
我使用FlowLayout来显示文本视图列表(它可能包含10-15个文本视图)。因此,基于可用的空屏幕空间,我想显示文本视图的数量。例如,如果要在那里显示15个文本视图,并且在大屏幕中有10个文本视图的空间,我想显示9个文本视图并在最后一个文本视图中显示“+6”。在一个小屏幕空间可能只有5个textviews可用,因为我想在最后一个textview中显示4个带有“+11”的文本视图。为了清楚理解,这是截图。如您所见,要显示的实际文本视图数为5.但显示的是2,并且添加了+3。同样,根据可用的屏幕空间,我想在布局中添加多个textview。
如何以编程方式实现这一目标?
答案 0 :(得分:9)
尝试以编程方式将TextView添加到for循环中的linearLayout,其中在添加每个textView后,获得剩余宽度可用(可以使用[ScreenWidth-](添加的textviews宽度+ [no.of textviews * margin / padding]计算每个])] *)
如果宽度小于某个最小值(假设每个文本视图最少需要100px),则打破循环并添加计数指示符文本。
我可以想到下面的代码,它可能不准确但只是为了向您展示我在想什么
int screenWidth = getScreenWidth();
int currentWidth=0;
int minimumWidthForAChildWithOffset = 100;//offset should include width of indicator
int childCount = 10;
int paddingForEachChild = 15;
for (int i = 0; i <childCount; i++) {
TextView label= getChildView();
parent.addView(label, i);
currentWidth += parent.getChildAt(i).getWidth() + paddingForEachChild;
if(i!=childCount-1/*ignore if this is the last item*/ && screenWidth-currentWidth<=minimumWidthForAChildWithOffset){
//add indicator label to layout here
break;
}
}
答案 1 :(得分:2)
尝试在循环中添加textviews,在新的OnPreDrawListener中单独添加每个textview。添加每个后,检查它是否超过行上的空格,如果是,请将其删除并添加计数器。如果它仍超过该行,请再删除一行并增加计数器。
关键是在单独的OnPreDrawListener中测试每个,所以这一切都在显示视图之前发生,但在之后视图的布局和大小已经计算出来。
答案 2 :(得分:2)
如果我必须实现你所描述的内容,我会尝试fork / subclass FlowLayout并更新其onMeasure
和onLayout
方法。
这里是FlowLayout:https://github.com/blazsolar/FlowLayout/blob/develop/FlowLayout/src/main/java/com/wefika/flowlayout/FlowLayout.java
1)第一步是在onMeasure
中限制FlowLayout的高度。此外,这样做可能就足够了:
<LinearLayout android:orientation="vertical" ... >
<RelativeLayout ... />
<FlowLayout android:layout_height="0dp" android:layout_weight="1" ... />
<RelativeLayout ... />
</LinearLayout>
2)第二步是更新onLayout
,以便在达到最大高度时停止添加线条和线条视图,然后添加显示隐藏视图数量的视图