2012-04-17 6 views
2

이 코드를 사용하여 buttonClick 이벤트를 사용하여 데이터베이스에서 vaules을 동적으로 인쇄합니다.
데이터베이스 항목을 삭제할 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(); 
        } 

은 처음 레이아웃이 정상입니다. 첫 번째 또는 마지막 데이터 행을 삭제해도 변경되지는 않지만 중간에있는 행이 삭제되면 레이아웃이 서로 겹칩니다.

이 논리 오류를 해결하려면 제안 해주십시오.

답변

2

좋아요. 문제를 이해했습니다. 문제는 모든 상대 레이아웃을 추가하는 상대 레이아웃을 상대 레이아웃으로 사용하고 있다는 것입니다. 이제 첫 번째 상대 레이아웃을 삭제하면 부모와 자동으로 정렬되므로 아무런 문제가 없습니다.

마지막 상대 레이아웃을 삭제하면 문제가 발생하지 않습니다.

위의 레이아웃을 모두 삭제하면 위의 레이아웃을 자동으로 상위로 정렬합니다.

솔루션은 간단합니다. 부모 레이아웃을 선형 레이아웃으로 사용하면 상대 레이아웃을 위의 레이아웃과 정렬 할 필요가 없습니다. 선형 방식으로 자동 배열됩니다 ....

RelativeLayout rl = (RelativeLayout) findViewById (R.id.relativeLayout3); 이 레이아웃을 XML 파일의 linearlayout에서 변환하십시오.

이 당신을 도울 수있는 코드 :

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

// 루프 시작을위한 // 루프 당신이 목록보기를 사용한다고 생각 여기

종료됩니다

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); 

여기에서 너의 목적을 위해 그것은 더 나을 것이다. 어쨌든 이것은 또한 당신의 목적을 위해 relativelayout 배열과 버튼 배열을 관리해야합니다.

+0

고맙습니다 .. 솔루션을 얻었습니다.하지만이 레이아웃은 textview 아래에 있습니다.하지만 양쪽에 모두가 필요합니다 ... –

+0

당신은 단순히 자식 relativelayout을 만들 수 있습니다. textview를 선택한 다음 선형 레이아웃에 추가하면 행을 삭제하려는 경우 작업이 줄어들어 관련 레이아웃을 완전히 삭제할 수 있습니다. 당신이 이해하거나 당신에게 약간의 코드를 보내야한다 ... –

+0

미안 .. 나는 안드로이드에 아주 익숙하다. 당신이 pls 나에게 이것을 달성하는 방법을 제안 할 수 .. –

관련 문제