0

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

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

表格报告行:

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()方法以获取该行的实际相应报告,但我似乎无法正确处理。有人可以帮我解决这个问题吗?任何帮助,将不胜感激。

4

3 回答 3

2

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

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

于 2013-03-11T21:48:57.373 回答
1
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
            }
        }
    });
于 2013-03-11T21:49:50.867 回答
1

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();
    }
});
于 2013-03-11T21:52:11.973 回答