Android: 在适配器上打开对话框
Android: open dialog on adapter
如何在 RecyclerView 适配器中打开 DialogFragment,或者如何通过主 activity 打开?我需要通过单击添加到 RecyclerView 中的每个视图来打开它。
在您的 RecyclerviewAdapter 中,在视图的 onClick 方法中(单击的视图显示此对话框),您可以放置以下代码。
已编辑:
MyDialogFragment newFragment = MyDialogFragment.newInstance();
newFragment.show(((Activity) context).getSupportFragmentManager(), "Title");
注意:"context" 是创建 recyclerview 的 activity 的上下文。 (在 RecyclerviewAdapter 的 cnstructor 中作为参数传递的上下文变量。)
注2:MyDialogFragment 是您创建的对话框片段。在这个 MyDialogFragment 中,你应该有构造函数 newInstance()
MyDialogFragment 可以如下所示:
public class MyDialogFragment extends DialogFragment {
public static MyDialogFragment newInstance() {
MyDialogFragment frag = new MyDialogFragment();
return frag;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// Get the layout inflater
LayoutInflater inflater = getActivity().getLayoutInflater();
// Inflate and set the layout for the dialog
// Pass null as the parent view because its going in the dialog layout
builder.setView(inflater.inflate(R.layout.fragment_myDialog, null))
.setTitle("Title")
...
// Set ur code
return builder.create();
}
}
所以现在关于如何从 mainActivity 传递上下文,当您创建适配器时,您传递给适配器的 activity 上下文就是我正在谈论的上下文。
例如:下面代码中的 "this" 是您将传递给适配器的 activity 上下文。此代码存在于您的 MainActivity 中。
MyAdapter adapter1 = new MyAdapter(this, array_list);
mRecyclerView.setAdapter(adapter1);
这是我在处理 recyclerView 项目点击事件时通常做的事情:
创建一个点击监听器以供以后重用。
public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
@SuppressWarnings("CanBeFinal")
private OnItemClickListener mListener;
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
@SuppressWarnings("CanBeFinal")
private GestureDetector mGestureDetector;
public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
mListener = listener;
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
View childView = view.findChildViewUnder(e.getX(), e.getY());
if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
}
return false;
}
@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}}
然后要在您的 Activity 中使用它,请执行以下操作:
mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
showDialog();
}
}));
希望对您有所帮助!
在 DialogFragment 上设置:
public static myFragment newInstance() {
return new myFragment();
}
在适配器上设置:
public Activity mcontext;
public SubjectsAdapter(Activity context) {
// Here we're getting the activity's context,
// by setting the adapter on the activity with (this)
this.mcontext=context;
}
通过适配器显示如下:
myFragment newFragment = myFragment.newInstance();
newFragment.show(mcontext.getFragmentManager(), "Title");
如何在 RecyclerView 适配器中打开 DialogFragment,或者如何通过主 activity 打开?我需要通过单击添加到 RecyclerView 中的每个视图来打开它。
在您的 RecyclerviewAdapter 中,在视图的 onClick 方法中(单击的视图显示此对话框),您可以放置以下代码。 已编辑:
MyDialogFragment newFragment = MyDialogFragment.newInstance();
newFragment.show(((Activity) context).getSupportFragmentManager(), "Title");
注意:"context" 是创建 recyclerview 的 activity 的上下文。 (在 RecyclerviewAdapter 的 cnstructor 中作为参数传递的上下文变量。)
注2:MyDialogFragment 是您创建的对话框片段。在这个 MyDialogFragment 中,你应该有构造函数 newInstance()
MyDialogFragment 可以如下所示:
public class MyDialogFragment extends DialogFragment {
public static MyDialogFragment newInstance() {
MyDialogFragment frag = new MyDialogFragment();
return frag;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// Get the layout inflater
LayoutInflater inflater = getActivity().getLayoutInflater();
// Inflate and set the layout for the dialog
// Pass null as the parent view because its going in the dialog layout
builder.setView(inflater.inflate(R.layout.fragment_myDialog, null))
.setTitle("Title")
...
// Set ur code
return builder.create();
}
}
所以现在关于如何从 mainActivity 传递上下文,当您创建适配器时,您传递给适配器的 activity 上下文就是我正在谈论的上下文。 例如:下面代码中的 "this" 是您将传递给适配器的 activity 上下文。此代码存在于您的 MainActivity 中。
MyAdapter adapter1 = new MyAdapter(this, array_list);
mRecyclerView.setAdapter(adapter1);
这是我在处理 recyclerView 项目点击事件时通常做的事情:
创建一个点击监听器以供以后重用。
public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
@SuppressWarnings("CanBeFinal")
private OnItemClickListener mListener;
public interface OnItemClickListener {
void onItemClick(View view, int position);
}
@SuppressWarnings("CanBeFinal")
private GestureDetector mGestureDetector;
public RecyclerItemClickListener(Context context, OnItemClickListener listener) {
mListener = listener;
mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
return true;
}
});
}
@Override
public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
View childView = view.findChildViewUnder(e.getX(), e.getY());
if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
}
return false;
}
@Override
public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}}
然后要在您的 Activity 中使用它,请执行以下操作:
mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
showDialog();
}
}));
希望对您有所帮助!
在 DialogFragment 上设置:
public static myFragment newInstance() {
return new myFragment();
}
在适配器上设置:
public Activity mcontext;
public SubjectsAdapter(Activity context) {
// Here we're getting the activity's context,
// by setting the adapter on the activity with (this)
this.mcontext=context;
}
通过适配器显示如下:
myFragment newFragment = myFragment.newInstance();
newFragment.show(mcontext.getFragmentManager(), "Title");