【问题标题】:Index of Table Row in TableLayoutTableLayout中表格行的索引
【发布时间】:2016-06-16 04:48:11
【问题描述】:

我有一个 TableLayout 和一些未知数量的 TableRows,它们是根据数据库中的内容生成的。

每一行都附加了一个 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);
    }
}

【问题讨论】:

    标签: java android android-layout


    【解决方案1】:

    遇到同样的问题,解决方法如下:

    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 上有了 Listener...

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

    【讨论】:

    • 这是迄今为止提出的最可靠的解决方案。
    • 极好的解决方案。不需要复杂的对象调用。使用板载方法。
    • @Ullauri,点赞它就像魅力和乐趣一样。 :)
    • 谢谢我正在寻找的东西
    【解决方案2】:

    试试这个,

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

    【讨论】:

      【解决方案3】:

      使用 TableRow 的标签:

      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
      
          // ...
      }
      

      现在要获取索引,只需在 onClick 中将其转换回 int 即可为您提供原始视图。

      旁白
      有些人不赞成以这种方式使用 Tag,因为它将数据层与 UI 层耦合在一起。另一种方法是使用字典或字典等来间接访问项目,而不将 UI 元素绑定到数据对象。

      【讨论】:

      • 你把变量弄混了,条目不是表格行。最后我只是输入条目作为标签。
      • 您应该阅读旁白并考虑将标签设置为索引。这将减少对您可能希望稍后进行垃圾收集的数据对象的杂散引用,并且总体而言,完全是更好的编程实践。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-29
      • 1970-01-01
      • 2018-06-08
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 2019-12-25
      相关资源
      最近更新 更多