Android动态RelativeLayout彼此重叠

问题描述:

我使用此代码通过buttonClick事件从我的数据库动态打印虚值。
用于删除数据库条目的buttonClick事件存在于循环中。Android动态RelativeLayout彼此重叠

这里我的代码:

RelativeLayout rl = (RelativeLayout) findViewById(R.id.relativeLayout3); 

    final DatabaseHandler dbpin = new DatabaseHandler(this); 
    // Log.d("Reading: ", "Reading all tasks.."); 
    List<Detail> detail1 = dbpin.getAllDetail();  
    Button[] button=new Button[1000]; 
      for (Detail cn : detail1) { 
       String log = cn.getTitle(); 
      final int i = cn.getID(); 

      button[i] = new Button(this); 
     button[i].setText("Delete"); 
     button[i].setTextSize(10); 

     button[i].setId(2000 + i); 
    int width = 80; 
    int height = 60; 

    TextView textview = new TextView(this); 
    textview.setText(log); 
    textview.setWidth(200); 
    textview.setTextSize(20); 
    textview.setPadding(0, 10, 0, 0); 
    textview.setId(2000 + i); 

    if (i == 0) { 
     RelativeLayout.LayoutParams rlp2 = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.FILL_PARENT, 
       RelativeLayout.LayoutParams.WRAP_CONTENT); 
     rlp2.addRule(RelativeLayout.ALIGN_PARENT_TOP); 
     rlp2.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
     textview.setLayoutParams(rlp2); 
     rl.addView(textview); 
     RelativeLayout.LayoutParams rlp1 = new RelativeLayout.LayoutParams(
       width, height); 
     rlp1.addRule(RelativeLayout.ALIGN_PARENT_TOP); 
     rlp1.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
     button[i].setLayoutParams(rlp1); 
     rl.addView(button[i]); 
    } else { 
     RelativeLayout.LayoutParams rlp2 = new RelativeLayout.LayoutParams(
       RelativeLayout.LayoutParams.FILL_PARENT, 
       RelativeLayout.LayoutParams.WRAP_CONTENT); 
     rlp2.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
     rlp2.addRule(RelativeLayout.BELOW, button[i].getId() - 1); 
     textview.setLayoutParams(rlp2); 
     rl.addView(textview); 
     RelativeLayout.LayoutParams rlp1 = new RelativeLayout.LayoutParams(
       width, height); 
     rlp1.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
     rlp1.addRule(RelativeLayout.BELOW, button[i].getId() - 1); 
     button[i].setLayoutParams(rlp1); 
     rl.addView(button[i]); 
    } 


    button[i].setOnClickListener(new Button.OnClickListener() { 
     public void onClick(View v) { 


      Intent myIntent = new Intent(v.getContext(), details.class); 
      Detail detail = new Detail(); 
      detail.setID(i); 
      dbpin.deleteDetail(detail); 
      startActivityForResult(myIntent, 1);   
     } 
     });      
} 

继数据库处理程序代码,检索使用循环从数据库中的所有细节:

// Getting All detail 
        public List<Detail> getAllDetail() { 
         List<Detail> detailList = new ArrayList<Detail>(); 
         // Select All Query 
         String selectQuery = "SELECT * FROM " + TABLE_DETAIL; 

         SQLiteDatabase db = this.getWritableDatabase(); 
         Cursor cursor = db.rawQuery(selectQuery, null); 

         // looping through all rows and adding to list 
         if (cursor.moveToFirst()) { 
          do { 
           Detail detail = new Detail(); 
           detail.setID(Integer.parseInt(cursor.getString(0))); 
           detail.setTitle(cursor.getString(1)); 
           detail.setDetail(cursor.getString(2)); 

           // Adding contact to list 
           detailList.add(detail); 
          } while (cursor.moveToNext()); 
         } 

         // return contact list 
         return detailList; 
        } 

// Deleting single detail 
        public void deleteDetail(Detail detail) { 
         SQLiteDatabase db = this.getWritableDatabase(); 
         db.delete(TABLE_DETAIL, KEY_DETID + " = ?", 
           new String[] { String.valueOf(detail.getID()) }); 
         db.close(); 
        } 

起初的布局是正常的。删除第一个或最后一个数据行不会导致任何更改,但是如果中间的一行被删除,则布局会相互重叠。

请给我建议,以清除这个逻辑错误。

好吧,我已经理解你的问题。问题在于,您正在使用相对布局作为您的父布局,并在其中添加您的所有与子相关的布局。现在,如果您删除了第一个相对布局,那么它会自动与其父级对齐,这样就没有问题了。

如果删除最后一个相对布局,那么也不会出现问题。

现在,您已将所有相对布局对齐到上面的布局,所以如果删除上面的布局,它会自动对齐其父级。

解决方法很简单。将您的父级布局用作线性布局,以便您不需要将相对布局与其上面的布局对齐。它会自动安排在一个线性的方式....

RelativeLayout rl =(RelativeLayout)findViewById(R.id.relativeLayout3);在xml文件中将此布局转换为linearlayout。

的代码,它可以帮助你:从这里

RelativeLayout rl = new RelativeLayout(getApplicationContext()); 
    RelativeLayout.LayoutParams lp_btn = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 
                    LayoutParams.WRAP_CONTENT); 
    lp_btn.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
    Button temp_button = new Button(getApplicationContext()); 
    temp_button.setText("button"); 
    rl.addView(temp_button, lp_btn); 
    TextView tv = new TextView(getApplicationContext()); 
    tv.setText("bharat"); 
    tv.setBackgroundColor(Color.GREEN); 
    RelativeLayout.LayoutParams lp_tv = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, 
                    LayoutParams.WRAP_CONTENT); 
    lp_tv.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
    rl.addView(tv, lp_tv); 
    lp.addView(rl); 

// for循环将在这里结束

我认为你应该使用的ListView

LinearLayout lp = (LinearLayout) findViewById(R.id.LinearLayout1); 

// for循环的开始为了你的目的,它会更好。无论如何,这也将工作,你必须为你的目的管理relativelayout数组和按钮数组。

+0

谢谢..得到了解决方案..但这使得像这样的布局..在textview下面的按钮...但我想要并排。 – 2012-04-17 06:01:35

+0

为您可以创建简单的child relativelayout添加您的按钮和在他们的textview,然后将其添加到线性布局它会减少你的工作,如果你想删除一行,那么你可以完全删除相对布局。你有没有明白或者我应该向你发送一些小小的代码... – 2012-04-17 06:07:28

+0

对不起..我对android很陌生..你能否建议我如何实现这个.. – 2012-04-17 06:12:47