簡體   English   中英

在活動(RecyclerView.Viewholder)外部構建AlerDialog

[英]Build AlerDialog outside of an Activity (RecyclerView.Viewholder)

我正在使用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。這個”。 因此,我仍然收到錯誤:

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 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);
    }

這就是我創建Viewholder的方式:

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

每個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()

更改您的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);

        ...
    }
}

要將上下文傳遞給ViewHolder,必須首先將其傳遞給RecyclerView Adapter。

如果您在片段中創建適配器(就像我通常所做的那樣),則應該通過覆蓋onAttach-Method獲得Context。

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

否則,您可以通過調用MyActivity.this獲取上下文。

您可以通過一些方法找到Builder的上下文,另一種方法是將其作為參數傳遞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM