[英]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.