【问题标题】:Can't figure out casting in onClick() method无法确定在 onClick() 方法中的转换
【发布时间】:2013-03-11 21:44:24
【问题描述】:

我编写了一个旨在显示报告的应用程序。应用程序的第一个屏幕是显示报告信息(名称、路径)的表格。

所以我想让表格的行可点击,以便将我带到显示报告详细信息的下一个屏幕,并了解该行对应的报告是什么。所以我自己写了一行:

TableReportRow:

public class TableReportRow extends TableRow {

    Report report;

    public TableReportRow(Context context, Report report) {
        super(context);
        this.report = report;
    }

    public Report getReport() {
        return report;
    }

    public void setReport(Report report) {
        this.report = report;
    }
}

然后我以编程方式创建了表格:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.reports_list_activity_layout);
    application = (SGRaportManagerAppObj)getApplication();
    reportsRepository = application.reportsRepository.getReportsRepository();
    TableLayout table = (TableLayout) findViewById(R.id.tableReportsList);
    table.setStretchAllColumns(true);  
    table.setShrinkAllColumns(true);  
    final String tag = "tag";

    for (int i= 0; i < reportsRepository.size(); i++) {
        Report tempReport = reportsRepository.get(i);
        TableReportRow row = new TableReportRow(this, tempReport);
        // ...

        row.addView(tvName);
        row.addView(tvPath); 
        row.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // This is where I need help.
            }
        });
        table.addView(row);
    }

现在我需要对onClick() 中的视图执行强制转换以访问GetReport() 方法以获取该行的实际相应报告,但我似乎无法正确处理。有人可以帮我解决这个问题吗?任何帮助将不胜感激。

【问题讨论】:

  • 我猜是 Report result = ((TableReportRow)v).getReport(); - 还是太明显了?
  • 出于某种原因,eclipse 会在清理之前给我错误,但你是对的,我的错。

标签: android casting onclick row android-tablelayout


【解决方案1】:

您可以将其转换为 TableReportRow。当 onClick 被调用时,监听器所附加的视图作为参数传入。

这很有用,因为它允许为多个按钮回收同一个侦听器,并且您可以识别视图上的操作(基于文本、内容、id 等...)

【讨论】:

    【解决方案2】:

    onClick 事件中的 View 参数是处理程序绑定到的 View。因此,在您的情况下,它将是 TableReportRow 的一个实例,因此:

    row.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
             TableReportRow local = (TableReportRow) v;
        }
    });
    

    或者将您的行定义为外部块中的最终行:

    final TableReportRow row = new TableReportRow(this, tempReport);
    ...
    row.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
             // row is in scope here
             row.getVirtualChildCount();
        }
    });
    

    【讨论】:

    • getVirtualChildCount() 是做什么的;会为我生产吗?
    • Nothing.. 这只是一个示例,您可以将 TableReportRow 实例“AS”上的方法调用为 TableReportRow 实例
    【解决方案3】:
    TableReportRow row = new TableReportRow(this, tempReport);
    row.setId(i);//set an id for this.
    //...
    row.setOnClickListener(new View.OnClickListener() 
            {
                @Override
                public void onClick(View v) 
                {
                            TableReportRow myRow=(TableReportRow)v;
                            int id=myRow.getId();//your id.
                            myRow.getReport();//yourReport
                }
            }
        });
    

    【讨论】:

      猜你喜欢
      • 2012-05-17
      • 2020-04-29
      • 2011-08-09
      • 2013-12-18
      • 1970-01-01
      • 1970-01-01
      • 2018-11-26
      • 1970-01-01
      • 2021-04-21
      相关资源
      最近更新 更多