2011-12-21 76 views
0

私はテーブルレイアウトを作成するためにこのコードを持っています。すべての行に1つのOnclickListenerイベントがあります。タブローを定義する方法を教えてください

for(int i=0;i<5;i++){ 
     TextView title1 = new TextView(this); 
     title1.setText("Thành Phố:"+i); 

     TableRow.LayoutParams params = new TableRow.LayoutParams(); 
     params.span = 5; 

     TableRow rowTitle = new TableRow(this); 
     rowTitle.setGravity(Gravity.CENTER_HORIZONTAL); 
     rowTitle.addView(title1, params);    
     TableRow tbr2 = new TableRow(this); 
     **tbr2.setOnClickListener(onclick);**   
     TextView tv2 = new TextView(this);   
     tv2.setText("type"+i);   
     TextView tv3 = new TextView(this); 
     tv3.setText("buy"+i);   
     tbr2.addView(tv3);  
     tbr2.addView(tv2);   
     table.addView(rowTitle); 
     table.addView(tbr2);   
    } 
    scr.addView(table); 
    layout.addView(scr); 
    setContentView(layout); 

が、これはOnclicklistener

private OnClickListener onclick = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     Log.d("1234", "abcd"); 
    } 
}; 

であり、これは私のproplemです:私は別の作業を行う必要がありますeveryrow。テーブル行をクリックしたかどうかを教えてください。

答えて

0
// Outside loop 
int[] ids = {1 , 2 , 3 , 4 , 5}; // or int[] ids = {R.id.table_row_1 // etc }; 

// Inside loop 

TableRow tbr2 = new TableRow(this); 
tbr2.setId(ids[i]); 
tbr2.setOnClickListener(onclick); 


// On Click 
    @Override 
    public void onClick(View v) { 
     switch(v.getId()){ 
      case 1: // or R.id.table_row_1 
       // tbr2 
      break; 
     } 
    } 

sup? :-)

+0

本当にありがとうございました! –

0

Blundellのソリューションは完全に受け入れられます。そうしたくない場合は、別の方法として、各行に異なるOnClickListenerを使用する方法があります。

private OnClickListener[] clickListeners = new OnClickListener[] { 
    new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Log.d("0", "Row 0 click"); 
     } 
    },  
    new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Log.d("1", "Row 1 click"); 
     } 
    }, 
    //Continue with more click listeners 
}; 

tbr2.setOnClickListener(clickListeners[i]); 
0

なるよりもリスナーを設定するようにコードIは、いくつかの特定のオブジェクト(例えば、その行番号)を記憶し、各表の行にsetTag()を使用してお勧めします。すべての行に同じonclickを設定します。 onClick()では、行番号(または何でも)を取得するのにv.getTag()を使用してください。

など。 (未テスト):...その後

tbr2.setTag(i); 

public void onClick(View v) { 
    Log.d("1234", String.format("row %d", v.getTag())); 
} 
+0

ありがとう! –

+0

この正確なシナリオでsetIdが設計されている場合、なぜsetTagを使用するのですか?あなたのコードを維持しなければならない人を混乱させるだけです。 – Blundell

+0

整数は便利に格納できるものの1つにすぎないためです。その行のデータフィールドをすべて格納しているオブジェクトは、実際にはここでより役立つかもしれません。そのため、私は「何らかの識別オブジェクト」と言っています。しかし、intを格納したいだけなら、setId()は機能します。 –

関連する問題