Android - 在自定义CursorAdapter中编码onActivityResult,用于嵌入式startActivityresult

时间:2013-08-27 22:54:26

标签: listview android-cursoradapter multiple-columns onactivityresult

在我的项目中,我有一个带有多列ListView的活动。此ListView从我在单独的java模块中实现的自定义CursorAdapter中绘制其数据。我在ListView的行中有几个视图的监听器,这些视图在CursorAdapter中实现。其中一个侦听器需要编辑调用它的视图内容并将数据保存回底层数据库。

根据收到的建议here我设法编写了startActivityForResult代码。但是,我无法找到编写onActivityResult例程的方式或位置,以便处理来自对话框活动的响应。有人有什么建议吗?

public class CustomCursorAdapter extends CursorAdapter {

private static final String TAG = CustomCursorAdapter.class.getSimpleName();
private static final int EDIT_TIME_REQUEST_CODE = 11;

protected static class RowViewHolder {
    public Button btnLap;
    public TextView tvTime;
    public Context ctx;
}

public CustomCursorAdapter(Context context, Cursor c) {
    super(context, c);
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View retView = inflater.inflate(R.layout.single_row_item, parent, false);

    RowViewHolder holder = new RowViewHolder();
    holder.btnLap = (Button) retView.findViewById(R.id.btn_lap);
    holder.tvTime = (TextView) retView.findViewById(R.id.tv_time);
    holder.ctx = context;
    holder.btnLap.setOnClickListener(btnLapOnClickListener);
    holder.tvTime.setOnClickListener(tvTimeOnClickListener);

    retView.setTag(holder);

    return retView;
}

...

private OnClickListener tvTimeOnClickListener = new OnClickListener() {
    @Override
    public void onClick(View v) {
            TextView tv = (TextView) v;
            String strTime = tv.getText().toString();
            // get the RowViewHolder
            RowViewHolder holder = new RowViewHolder();
            holder = (RowViewHolder) ((View) v.getParent()).getTag();
            Intent intentTimeEdit = new Intent(holder.ctx, TimeEditDialog.class);
            intentTimeEdit.putExtra("Time", strTime);
            // Set up intent to pass to dialog
            ((Activity)holder.ctx).startActivityForResult(intentTimeEdit, EDIT_TIME_REQUEST_CODE);
        }
    }
};

}

1 个答案:

答案 0 :(得分:0)

我已经解决了这个问题。对于有类似问题的人,在ListView的自定义CursorAdapter中的row元素的侦听器中,我调用了一个静态例程,在父活动中的editTime,我传递了一个活动,向它投射了一个上下文,ctx,项目的视图,以及数据库的rowid。 “holder”是行视图中标记的rowviewholder。

                RaceSheetActivity.editTime((Activity)holder.ctx, v, holder.intId);

editTime例程调用了我的TimeEditDialog活动:

public static void editTime(Activity activity, View v, long intTargetId) {
    tvTarget = (TextView) v;
    String strTime = tvTarget.getText().toString();
    // Set up intent to pass to dialog
    Intent intentTimeEdit = new Intent(activity.getBaseContext(), TimeEditDialog.class);
    intentTimeEdit.putExtra("Request Code", EDIT_TIME_REQUEST_CODE);
    intentTimeEdit.putExtra("Time", strTime);
    intentTimeEdit.putExtra("Row Id", intTargetId);
    activity.startActivityForResult(intentTimeEdit,EDIT_TIME_REQUEST_CODE);
}

然后在父活动的onActivityResult方法中处理对话框的响应。

问题领域意识到如果我将处理保留在自定义CursorAdapter中并且必须在父活动中管理它,我无法解析静态/非静态调用,并且我可以将startActivityForResult对话框所需的活动转换为上下文传递给CursorAdapter并处理父活动中的响应。

任何改善这种情况的方法都会感激不尽。