我编写了一个旨在显示报告的应用程序。应用程序的第一个屏幕是一个表格,显示报告的信息(名称,路径)。
所以我想让表格的行可点击,以便带我到下一个显示报告详细信息的屏幕,并知道该行的相应报告是什么。所以我写了自己的一行:
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()
方法的访问权限,以获取该行的实际相应报告,但我似乎无法正确行事。请问有人帮我这个吗?任何帮助将不胜感激。
答案 0 :(得分:2)
您可以将其强制转换为TableReportRow。调用onClick时,将附加侦听器的视图作为参数传入。
这很有用,因为它允许为多个按钮回收相同的监听器,并且您可以识别视图上的操作(基于文本,内容,ID等)。
答案 1 :(得分: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
}
}
});
答案 2 :(得分:1)
onClick事件中的View参数是处理程序绑定的View。所以在你的情况下它将是TableReportRow的一个实例,因此:
row.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
TableReportRow local = (TableReportRow) v;
}
});
或者在外部块中将行定义为final:
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();
}
});