Android - 动态textViews - setMargins不适用?

时间:2013-04-22 13:01:10

标签: android android-layout relativelayout textview

我正在尝试制作一个动态的网格布局,它是API 10+是让它变得缓慢的部分。我试图让它自动包装..但最终发现它更容易尝试使用坐标强制它成网格图案。当我在创建时进行定位时,这个脚本自行工作,但现在我试图循环遍历每个项目。因此,如果删除了一个项目,它们都会浮回到网格中间而没有孔。

问题是,布局参数似乎只适用于最后一个对象。

以下是一些基本变量和onCreate设置:

int screenWidth;
int screenHeight;
int distStep = 130;
int leftPad = 20;
int numCols;
int baseID = 0;

android.util.DisplayMetrics metrics = this.getResources().getDisplayMetrics();
screenWidth = metrics.widthPixels;
screenHeight = metrics.heightPixels;
numCols = (int) (screenWidth - leftPad) / distStep;
int scrRemain = screenWidth - ((numCols * distStep) + leftPad);
distStep += (int) scrRemain / numCols;

然后进入添加的主要功能:

public void addObjToLayout() {
    RelativeLayout relLay = (RelativeLayout) this.findViewById(R.id.mainWindow);
    for(int i = 1; i <= currQuantity; i++){
        TextView tv=new TextView(this);
        tv.setTextSize(40);
        tv.setId(baseID + i);
        tv.setPadding(24, 4, 24, 4);
        tv.setBackgroundColor(0x110000FF);
        tv.setText(String.valueOf(baseID + i));     //Val for debugging
        tv.setTextColor(0xFFFFFFFF);
        relLay.addView(tv);
    }
    baseID += currQuantity;
    sortLayout();
  }

然后排序:

public void sortLayout() {
    int leftNum = 20;
    int topNum = 0;
    for(int i = 1; i <= baseID; i++){
        TextView tv= (TextView) this.findViewById(baseID);
        MarginLayoutParams mp = new MarginLayoutParams(tv.getLayoutParams());
        mp.setMargins(leftNum, topNum, 0, 0);
        RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(mp);
        tv.setLayoutParams(lp);
        leftNum += distStep;
        if(leftNum >= distStep * numCols){
            leftNum = leftPad;
            topNum += distStep;
        }
    }
  }

我得到的是所有textViews都堆积在左上角,除了最后一个文本定位到它应该的位置。所以在我看来,params对象直到循环结束或者其他东西才适用..但逻辑上我不明白为什么。

正如我所说的那样,当我在开始时设置参数时,这是有效的,问题是立即大量更新它们。我对android很新,所以我希望我不只是做一些愚蠢的事情。

感谢您的时间

2 个答案:

答案 0 :(得分:0)

保证金意味着它将在前一个视图和当前视图之间设置一个间隙。 将view1,view2和view3添加到网格布局时,如果在某个时间点删除view2,则根据view1设置view3的边距。因此,它不会留空空间代替view2。不要在运行时删除view2,而是将view2的背景设置为null,并将文本设置为空,如下所示。

textView.setBackground(null);
textView.setText("");

这样视图仍然可用但看起来已删除。

答案 1 :(得分:0)

开始使用扩展的baseAdapter查看GridView。看起来很有希望:

更多信息(参见#2): http://www.mkyong.com/android/android-gridview-example/