从动态自定义表,行获取id

时间:2012-08-30 21:44:23

标签: java android onclicklistener

我正在创建一个包含动态自定义表行的表。我需要在活动类中获取id。

main_Activity - > MyTableLayoutView - > MyTableRow

我的问题是,如何将表格中单击的单元格(TextViews)的id添加到main_Activiy。

MyTableRowView:

    public void addRow(String[] data, int[] rowId) {
    for (int i = 0; i < data.length; i++) {
        TextView tv = parseTextView(data[i]);
        tv.setId(rowId[i]);
        tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                TextView tv2 = (TextView) v;
                clickedText = tv2.getText().toString();
                Debug.debugMsg(clickedText + " " + tv2.getId());
            }
        });
        this.addView(tv);
    }
}

据我所知,从TablerowView类中获取id,但我需要它在Activity类中,如果有人可以启发我的话。提前谢谢。

活动类:

    private void showTables() {
    db.open();
    db.importDb();// TODO
    table = new TableLayoutView(this,Converter.toArrayListStringArray(db.getDbTablesForChoose()));
    table.addDataListArray(Converter.toArrayListStringArray(db.getDbTablesForChoose()),true);
    llChooseSQLTable.addView(table);
}

TableLayoutView:

    public void addDataListArray(ArrayList<String[]> data, boolean header) {

    for (int i = 0; i < ROW_NUMBERS; i++) {
        TableRowView tableRow = new TableRowView(context);

        tableRow.setLayoutParams(new LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        tableRow.addRow(data.get(i),idHandler.getNextIdsRow());//idHandles passes unique id.
        this.addView(tableRow); 
    }
}

2 个答案:

答案 0 :(得分:1)

您似乎可以从上面的代码中获取ID。如果您的主要关注点是将视图中的id传播回父类,那么您可以通过多种方式执行此操作。一种方法是获取视图的上下文,然后将其转换为特定活动并调用该活动中的函数,例如,在onClick()操作中:

public void onClick(View v) {
  ((MyActivity)v.getContext()).insertNotificationMethod(v.getId());
}

您的活动名为MyActivity,并且您实现了一个名为insertNotificationmethod的方法,该方法采用整数。只有当这个视图总是在这个函数中时,这才有效,即使这样,它也是一种相当粗略的方法。

你也可以使用:

直接在onClick()方法中调用它
MyActivity.this.insertNotificationMethod(v.getId());

但是,这种做法会限制此视图仅在此特定活动中有用。

对于更通用的方式,你可以使用BroadcastReceivers,它可能会比你想要的更复杂一些。有关这些内容的详细信息,请查看此处的Android文档:http://developer.android.com/reference/android/content/BroadcastReceiver.html

希望这有帮助。

答案 1 :(得分:0)

我能想到的唯一解决方案是将您的addRow()addDataListArray()方法移动到具有某些模式的

public void addRow(String[] data, int[] rowId, TableRowView tableRow) {
for (int i = 0; i < data.length; i++) {
    TextView tv = parseTextView(data[i]);
    tv.setId(rowId[i]);
    tv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            TextView tv2 = (TextView) v;
            clickedText = tv2.getText().toString();
            clickedId = tv2.getId());
        }
    });
    tableRow.addView(tv);
}
}

public void addDataListArray(ArrayList<String[]> data, boolean header, TableLayoutView table) {

for (int i = 0; i < ROW_NUMBERS; i++) {
    TableRowView tableRow = new TableRowView(context);

    tableRow.setLayoutParams(new LayoutParams(
            LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

    addRow(data.get(i),idHandler.getNextIdsRow(), tableRow);//idHandles passes unique id.
    table.addView(tableRow); 
}
}

在您的活动中更改此行:

//table.addDataListArray(Converter.toArrayListStringArray(db.getDbTablesForChoose()),true);
addDataListArray(Converter.toArrayListStringArray(db.getDbTablesForChoose()),true, table);

虽然我不知道您的应用的其他部分是否会受到我所做的巨大修改的影响。

祝你好运!