在Activity之外构建AlertDialog(RecyclerView.Viewholder)

时间:2014-12-18 01:07:17

标签: java android android-activity dialog alertdialog

我正在使用RecyclerView,并且只要长按RecyclerView中的某个项目,就想打开一个AlertDialog。

在RecyclerView的ViewHolder中,我实现了clicklistener

 @Override
    public boolean onLongClick(View v) {

        //Open Alert dialog to delete item

        AlertDialog.Builder alert = new AlertDialog.Builder(context);

        ...

}

我可以在这里阅读:http://goo.gl/Kd1c7i我需要将“MyActivity.this”传递给AlertDialog.Builder构造函数,但由于ViewHolder是RecyclerView Adapter的静态部分,我不能引用“MyActivity.this” ”。 因此我仍然得到错误:

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

那么如何从不扩展Activity的类创建AlertDialog?

@Edit:更多代码以获取更多信息:

这是我的RecyclerView Adapter构造函数:

RecyclerViewCourseAdapter(ArrayList<Course> courses, Context context) {
    this.context = context;
    if (courses == null) {
        throw new IllegalArgumentException("courses ArrayList must not be null");
    }

    mCourseArrayList = courses;
}

我将给定的上下文存储为Adapter类中的private:

private Context context;

这是我的ViewHolder:

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener,View.OnLongClickListener {

    //Initialize views in Viewholder
    TextView mTextViewFirst;
    TextView mTextViewSecond;
    ImageView mImageView;
    TextView mEndPercentageTextView;

    //Context to refer to app context (for intent, dialog etc)
    Context context;

    //Adapter to notifiy data set changed
    RecyclerViewCourseAdapter mCourseAdapter;


    public ViewHolder(View itemView, Context context, RecyclerViewCourseAdapter mCourseAdapter) {

        super(itemView);
        this.context = context;
        this.mCourseAdapter = mCourseAdapter;
        itemView.setOnClickListener(this);
        itemView.setOnLongClickListener(this);
        mTextViewFirst = (TextView) itemView.findViewById(R.id.course_firstLine);
        mTextViewSecond = (TextView) itemView.findViewById(R.id.course_secondLine);
        mImageView = (ImageView) itemView.findViewById(R.id.icon);
        mEndPercentageTextView = (TextView) itemView.findViewById(R.id.end_percentage_textview);
    }

这就是我创建视图的方式:

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    //Inflate layout
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_course, parent, false);
    ViewHolder vh = new ViewHolder(itemView, context, this);

    return vh;
}

所以我使用适配器中存储的上下文创建我的ViewHolder。

如果仍有事情发生,这是全班同学: https://github.com/Tak3r07/UniHelper/blob/master/app/src/main/java/com/tak3r07/CourseStatistics/RecyclerViewCourseAdapter.java

3 个答案:

答案 0 :(得分:7)

每个View都有一个上下文,更改:

AlertDialog.Builder alert = new AlertDialog.Builder(context);

AlertDialog.Builder alert = new AlertDialog.Builder(v.getContext());

有关详细信息,请参阅文档:

http://developer.android.com/reference/android/view/View.html#getContext()

答案 1 :(得分:1)

更改ViewHolder类以存储这样的上下文:

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener {

    private Context mContext;

    public ViewHolder(View v, Context mContext) {
        super(v);
        this.mContext = mContext;

        ...
    }

    @Override
    public boolean onLongClick(View v) {

        //Open Alert dialog to delete item

        AlertDialog.Builder alert = new AlertDialog.Builder(this.mContext);

        ...
    }
}

要将Context传递给ViewHolder,必须先将其传递给RecyclerView适配器。

如果你在一个片段中创建你的适配器(就像我一般那样),你应该通过覆盖onAttach-Method

来获取Context。
@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    this.mContext = activity; // Activity is a subclass of Context
}

否则,您可以通过调用MyActivity.this

来获取上下文

答案 2 :(得分:0)

您可以在某些方面找到生成器的上下文,另一种方法是将其作为参数传递。