Jayakarthik Appasamy
Jayakarthik Appasamy

Reputation: 129

Android dynamic RelativeLayout overlaps each other

I use this code to dynamically print the vaules from my database with a buttonClick-event.
The buttonClick-event to delete the database entry is present inside the a loop.

Here my code:

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

Following the database handler code is, to retrieve all details from database using a loop:

// 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();
                    }

At first the layout is normal. Deleting first or the last data row doesn't cause any change, but if a row in the middle is deleted, then the layout overlaps each other.

Please give me suggestions to clear this logical error.

Upvotes: 2

Views: 2907

Answers (1)

Bharat Sharma
Bharat Sharma

Reputation: 3966

Ok I have understand your problem. Problem is that you are using relative layout as your parent layout in which you are adding all your child relative layouts. Now if you delete your first relative layout then it automatically align with its parent so there will be no problem.

If you delete last relative layout then also not problem occurs.

Now you have align all your relative layout form their above layout so if you delete above one it automatically aligns to its parent.

Solution is simple. Use your parent layout as linear layout so that you dont need to align relative layouts with their above layout. It will automatically arrange in a linear way....

RelativeLayout rl = (RelativeLayout) findViewById(R.id.relativeLayout3); convert this layout in linearlayout in your xml file.

This the code which can help you:

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

// for loop start from here

    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 loop will end here

I think you should use listview for your purpose it will be better. Anyway this will also work you have to manage relativelayout array and button array for your purpose.

Upvotes: 2

Related Questions