我正在使用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
答案 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)
您可以在某些方面找到生成器的上下文,另一种方法是将其作为参数传递。