2011-08-08 5 views
4

私はTableLayoutと、データベースの内容に基づいて生成されたいくつかの未知数のTableRowを持っています。TableLayoutのテーブル行のインデックス

すべての行にはOnClickリスナーが添付されていますが、クリックが発生すると、それはどの行から来たのか(意味的に)わかりません。 TableLayoutに関連してtablerowのインデックスを取得する方法はありますか?それとも別のものを試すべきですか?

いくつかのコード:

private void buildBudgetTable() { 
    NumberFormat currencyFormatter = DecimalFormat.getCurrencyInstance(); 

    TableLayout budgetTable = (TableLayout) findViewById(R.id.budgetTable); 
    budgetTable.removeAllViews(); 

    try { 
     this.budgetItems = Budget.GetEntries(this); 
    } catch (SQLException e) { 
     Toast.makeText(getApplicationContext(), "Could not load budget", Toast.LENGTH_SHORT).show(); 
     e.printStackTrace(); 
     finish(); 
    } 

    for(BudgetEntryItem entry : budgetItems){ 
     TableRow tr = new TableRow(this); 
     tr.setPadding(1, 2, 1, 2); 

     TextView txtLeft = new TextView(this); 
     txtLeft.setText(entry.Memo); 
     txtLeft.setGravity(Gravity.LEFT); 
     txtLeft.setPadding(3,3,3,3); 

     TextView txtRight = new TextView(this); 
     txtRight.setText(currencyFormatter.format(entry.Amount)); 
     txtRight.setGravity(Gravity.RIGHT); 
     txtRight.setPadding(3,3,3,3); 

     if(entry.Amount > 0){ 
      txtRight.setBackgroundColor(Color.rgb(0x33, 0xEE, 0x33)); 
      txtLeft.setBackgroundColor(Color.rgb(0x33, 0xEE, 0x33)); 
     }else{ 
      txtRight.setBackgroundColor(Color.rgb(0xEE, 0x33, 0x33)); 
      txtLeft.setBackgroundColor(Color.rgb(0xEE, 0x33, 0x33)); 
     } 

     tr.addView(txtLeft); 
     tr.addView(txtRight); 
     tr.setOnClickListener(this); 

     budgetTable.addView(tr); 
    } 
} 

答えて

3

のTableRowのタグを使用しますちょうど元のビューを提供しますあなたのonClickでintに戻ってそれを変換し、インデックスをつかむために今

BudgetEntryItem entry = null; 
for(int i = 0; i < budgetItems; i++){ 
    entry = budgetItems[i]; // or budgetItems.get(i), etc 
    TableRow tr = new TableRow(this); 

    // Set the index as the tag 
    tr.setTag(i); // or entry.setTag(entry.index()), etc 

    // ... 
} 

を。

アンはさておき
一部の人々は、原則的に、このようにタグを使用しての上で顔をしかめUI層とその夫婦データ層という。代わりに、辞書や辞書などを使用して、UI要素をデータオブジェクトに結び付けることなく間接的に項目にアクセスすることもできます。

+0

変数が混在しています。エントリはテーブル行ではありません。私はタグとしてエントリー項目に入るだけで巻き終わった。 – Malfist

+0

脇に目を通し、タグをインデックスに設定することを検討してください。あとでガベージコレクションをしたいかもしれないデータオブジェクトへの迷いの可能性の少ない参照につながり、全体的にはプログラミングのプラクティス全体が完全になります。 –

3

row = new TableRow(this); 
    row.setId(i); 

    row.setOnClickListener(new OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      Toast toast = Toast.makeText(getApplicationContext(), "Tabele row clicked "+ Integer.toString(v.getId()) , Toast.LENGTH_LONG); 
      toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0); 
      toast.show(); 

     } 
    }); 
5

、これを試してみて、同じ問題を持っていた、これは解決策である:私の場合は

row.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // Current Row Index 
       int rowIndex = tableLayout.indexOfChild(v); 
       // Do what you need to do. 
      } 
     }); 

、私はのTableRow内部のTextViewにリスナーを持っていた...

textView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // The row the view is in 
       TableRow row = (TableRow) v.getParent(); 
       // It's index 
       int index = tableLayout.indexOfChild(row); 
      } 
     }); 
+0

これまでに提案された最も信頼性の高いソリューションです。 – stevehs17

関連する問題