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

onClick イベントの 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();
    }
});
于 2013-03-11T21:52:11.973 に答える
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 に答える