0

我正在尝试制作一个动态网格布局,它是 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;
        }
    }
  }

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

正如我所说,这在我一开始就设置参数时起作用,问题是一次大规模更新它们。我对android很陌生,所以我希望我不只是在做一些愚蠢的事情。

谢谢你的时间

4

2 回答 2

0

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

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

于 2013-04-23T17:11:13.423 回答
0

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

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

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

于 2013-04-22T13:11:53.497 回答