2011-12-21 52 views
0

我有這段代碼來創建表格佈局。在每一行中,都有一個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

非常感謝! – 2011-12-21 23:48:55

0

布倫戴爾的解決方案是完全可以接受的。如果你不想這樣做,另一種方法是爲每一行使用不同的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

我建議在每個錶行使用setTag(),存儲一些識別對象(例如它的行編號)。爲每一行設置相同的onclick。在onClick()使用v.getTag()得到你的行號(或其他)。

E.g. (未經測試):

tbr2.setTag(i); 

然後...

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

非常感謝! – 2011-12-21 23:47:49

+0

爲什麼在setId設計用於此確切場景時使用setTag。你只會混淆需要維護代碼的人。 – Blundell 2011-12-22 13:10:46

+0

因爲整數只是你可以有效存儲的東西之一。存儲所有該行數據字段的對象在這裏實際上可能更有用,這就是爲什麼我說「一些識別對象」的原因。但是,是的,如果你只想存儲一個int,setId()就可以工作。 – 2011-12-22 19:06:32