android从多列listview调用活动

时间:2013-08-27 09:24:30

标签: android listview android-activity android-cursoradapter multiple-columns

在我的项目中,我有一个带有多列ListView的活动。此ListView从我在单独的java模块中实现的自定义CursorAdapter中绘制其数据。我在ListView的行中有几个视图的监听器,这些视图在CursorAdapter中实现。其中一个侦听器需要编辑调用它的视图内容并将数据保存回底层数据库。这种编辑需要startActivityForResult(作为自定义对话框)。但是我收到错误,因为活动只能从另一个活动调用。我已经尝试将startActivityForResult移动到父活动中的过程,但这是一个从侦听器调用的静态过程,我得到一个错误,因为startActivityForResult不能在静态进程中。错误是 “方法startActivityForResult(Intent,int)未定义类型new View.OnClickListener(){}”

是否有人从视图侦听器调用活动的进程,其中视图是ListView的行元素?

下面的代码是我在CursorAdapter中使用的过程。

public class CustomCursorAdapter extends CursorAdapter {

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

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.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();
        Intent intentTimeEdit = new Intent(getBaseContext(), TimeEditDialog.class);
        intentTimeEdit.putExtra("Time", strTime);
        startActivityForResult(intentTimeEdit, EDIT_TIME_REQUEST_CODE);
    }
};

根据下面的评论,OnClickListener的代码已更正为:

        TextView tv = (TextView) v;
        String strTime = tv.getText().toString();
        RowViewHolder holder = new RowViewHolder();
        holder = (RowViewHolder) ((View) v.getParent()).getTag();
        Intent intentTimeEdit = new Intent(holder.ctx, TimeEditDialog.class);
        intentTimeEdit.putExtra("Time", strTime);
        ((Activity)holder.ctx).startActivityForResult(intentTimeEdit, EDIT_TIME_REQUEST_CODE);

2 个答案:

答案 0 :(得分:0)

The method startActivityForResult(Intent, int) is undefined for the type new View.OnClickListener(){}可以看出,只有当类扩展了Acitvity时才能调用startActivityForResult或startActivity ..它甚至不会接受内部类...

尝试

((Activity)getBaseContext()).startActivityForResult(intentTimeEdit, EDIT_TIME_REQUEST_CODE);并检查结果。

答案 1 :(得分:0)

尝试在适配器类的构造函数中传递上下文,然后代替

startActivityForResult(intentTimeEdit, EDIT_TIME_REQUEST_CODE);

DO

ctx.startActivityForResult(intentTimeEdit, EDIT_TIME_REQUEST_CODE);