2

このコードを使用して、ボタンクリック イベントでデータベースから値を動的に出力します。
データベース エントリを削除するための buttonClick イベントは、ループ内にあります。

ここに私のコード:

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

最初は普通のレイアウト。最初または最後のデータ行を削除しても変化はありませんが、途中の行を削除するとレイアウトが重なります。

この論理エラーを解消するための提案をお願いします。

4

1 に答える 1

2

OK、私はあなたの問題を理解しました。問題は、すべての子相対レイアウトを追加する親レイアウトとして相対レイアウトを使用していることです。最初の相対レイアウトを削除すると、自動的にその親と整列するので、問題はありません。

最後の相対レイアウトを削除しても問題は発生しません。

これで、すべての相対的なレイアウトが上のレイアウトから整列されたので、上のレイアウトを削除すると、自動的にその親に整列されます。

解決策は簡単です。親レイアウトを線形レイアウトとして使用して、相対レイアウトを上のレイアウトに揃える必要がないようにします。それは自動的に線形に配置されます....

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

// for ループはここで終了します

目的に合わせてリストビューを使用する方が良いと思います。とにかく、これも機能しますが、目的に合わせてrelativelayout配列とボタン配列を管理する必要があります。

于 2012-04-17T05:46:21.910 に答える