android 无法在回收器视图适配器类中显示AlertDialog

b1payxdu  于 2024-01-04  发布在  Android
关注(0)|答案(4)|浏览(255)

我在回收器视图行中有按钮,我想在按钮单击时显示警报对话框。我在适配器类的onBindViewHolder方法中设置onClickListener,但当我单击按钮时,它显示运行时错误,如下所示:

  1. > 2019-12-25 22:22:57.140 11041-11041/com.app.aamku E/AndroidRuntime: FATAL EXCEPTION: main
  2. Process: com.app.aamku, PID: 11041
  3. android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
  4. at android.view.ViewRootImpl.setView(ViewRootImpl.java:765)
  5. at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356)
  6. at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
  7. at android.app.Dialog.show(Dialog.java:330)
  8. at Adapters.ProductAdapter$2.onClick(ProductAdapter.java:174)
  9. at android.view.View.performClick(View.java:6294)
  10. at android.view.View$PerformClick.run(View.java:24770)
  11. at android.os.Handler.handleCallback(Handler.java:790)
  12. at android.os.Handler.dispatchMessage(Handler.java:99)
  13. at android.os.Looper.loop(Looper.java:164)
  14. at android.app.ActivityThread.main(ActivityThread.java:6494)
  15. at java.lang.reflect.Method.invoke(Native Method)
  16. at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
  17. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

字符串
下面是我的代码:

  1. public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.ViewHolder> {
  2. private Context context;
  3. private List<ProductsModel> productList;
  4. public ProductAdapter(Context context, List<ProductsModel> productList) {
  5. this.context = context;
  6. this.productList = productList;
  7. }
  8. @NonNull
  9. @Override
  10. public ProductAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
  11. View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.selectpack_layout,parent,false);
  12. ViewHolder viewHolder = new ViewHolder(v);
  13. return viewHolder;
  14. }
  15. @Override
  16. public void onBindViewHolder(@NonNull final ProductAdapter.ViewHolder holder, final int position) {
  17. final ProductsModel model = productList.get(position);
  18. holder.marketName.setText(model.getMarketName());
  19. holder.order.setOnClickListener(new View.OnClickListener() {
  20. @Override
  21. public void onClick(View view) {
  22. AlertDialog.Builder builder = new AlertDialog.Builder(context);
  23. builder.setMessage("Confirm order");
  24. builder.setCancelable(true);
  25. builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
  26. @Override
  27. public void onClick(DialogInterface dialogInterface, int i) {
  28. dialogInterface.cancel();
  29. }
  30. });
  31. builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
  32. @Override
  33. public void onClick(DialogInterface dialogInterface, int i) {
  34. Toast.makeText(context,"Hello",Toast.Length_SHORT).show();
  35. }
  36. });
  37. AlertDialog alertDialog = builder.create();
  38. alertDialog.show();
  39. }
  40. });
  41. }
  42. @Override
  43. public int getItemCount() {
  44. return productList.size();
  45. }
  46. public class ViewHolder extends RecyclerView.ViewHolder{
  47. Button order;
  48. TextView marketName;
  49. public ViewHolder(@NonNull View itemView) {
  50. super(itemView);
  51. order = itemView.findViewById(R.id.order);
  52. marketName = itemView.findViewById(R.id.marketName);
  53. }
  54. }
  55. }


我如何才能克服这个问题,有人请让我知道我做错了什么,任何帮助将不胜感激。

谢谢

72qzrwbm

72qzrwbm1#

我刚刚复制了你的对话框代码,并创建了简单的演示,它的工作对我来说很好。看看演示:
适配器代码:

  1. import android.content.Context;
  2. import android.content.DialogInterface;
  3. import android.view.LayoutInflater;
  4. import android.view.View;
  5. import android.view.ViewGroup;
  6. import android.widget.TextView;
  7. import android.widget.Toast;
  8. import androidx.appcompat.app.AlertDialog;
  9. import androidx.recyclerview.widget.RecyclerView;
  10. public class MyListAdapter extends RecyclerView.Adapter<MyListAdapter.ViewHolder> {
  11. private Context context;
  12. public MyListAdapter(Context context) {
  13. this.context = context;
  14. }
  15. @Override
  16. public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  17. LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
  18. View listItem = layoutInflater.inflate(R.layout.list_item, parent, false);
  19. ViewHolder viewHolder = new ViewHolder(listItem);
  20. return viewHolder;
  21. }
  22. @Override
  23. public void onBindViewHolder(ViewHolder holder, int position) {
  24. holder.textView.setText("Fake item list " + position);
  25. holder.textView.setOnClickListener(new View.OnClickListener() {
  26. @Override
  27. public void onClick(View view) {
  28. AlertDialog.Builder builder = new AlertDialog.Builder(context);
  29. builder.setMessage("Confirm order");
  30. builder.setCancelable(true);
  31. builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
  32. @Override
  33. public void onClick(DialogInterface dialogInterface, int i) {
  34. dialogInterface.cancel();
  35. }
  36. });
  37. builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
  38. @Override
  39. public void onClick(DialogInterface dialogInterface, int i) {
  40. Toast.makeText(context, "Hello", Toast.LENGTH_SHORT).show();
  41. }
  42. });
  43. AlertDialog alertDialog = builder.create();
  44. alertDialog.show();
  45. }
  46. });
  47. }
  48. @Override
  49. public int getItemCount() {
  50. return 15;
  51. }
  52. public static class ViewHolder extends RecyclerView.ViewHolder {
  53. public TextView textView;
  54. public ViewHolder(View itemView) {
  55. super(itemView);
  56. this.textView = (TextView) itemView.findViewById(R.id.textView);
  57. }
  58. }
  59. }

字符串
活动代码:

  1. import androidx.appcompat.app.AppCompatActivity;
  2. import androidx.recyclerview.widget.LinearLayoutManager;
  3. import androidx.recyclerview.widget.RecyclerView;
  4. import android.os.Bundle;
  5. public class MainActivity extends AppCompatActivity {
  6. @Override
  7. protected void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.activity_main);
  10. RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
  11. MyListAdapter adapter = new MyListAdapter(this);
  12. recyclerView.setHasFixedSize(true);
  13. recyclerView.setLayoutManager(new LinearLayoutManager(this));
  14. recyclerView.setAdapter(adapter);
  15. }
  16. }


活动XML

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.recyclerview.widget.RecyclerView
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. xmlns:tools="http://schemas.android.com/tools"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. android:scrollbars="vertical"
  8. android:id="@+id/recyclerView"
  9. tools:context=".MainActivity">
  10. </androidx.recyclerview.widget.RecyclerView>


列表项XML:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schemas.android.com/apk/res/android"
  4. android:id="@+id/relativeLayout"
  5. android:layout_width="match_parent"
  6. android:layout_height="?android:attr/listPreferredItemHeightLarge"
  7. >
  8. <TextView
  9. android:id="@+id/textView"
  10. android:layout_width="wrap_content"
  11. android:layout_height="match_parent"
  12. android:text="item"
  13. android:gravity="center_vertical"
  14. android:textSize="16sp"/>
  15. </LinearLayout>


还可以查看导入,这里我使用的是Android x库。

展开查看全部
x6yk4ghg

x6yk4ghg2#

将Activity活动定义为变量Pass YourActivity.this while构造函数并使用AlertDialog.Builder builder = new AlertDialog.Builder(activity);创建对话框

kiayqfof

kiayqfof3#

我有相关的问题,当我想添加alertDialog后,按下片段上的项目。
alertDialog首先需要一个扩展Activity的Java类,所以我知道你有一个适配器,但你能把它翻过来吗?
在你点击列表视图中的列表后,这将调用类上的公共函数,扩展活动(有onCreate方法),它包含列表视图中的列表,并传递任何变量沿着。
函数是用传递的变量运行alertDialog,我认为这样应该没问题。
或者你可以手动改变你正在进行的活动的上下文,也许这是有效的。
很抱歉我不能给你给予一个例子,因为我很害怕。

dphi5xsq

dphi5xsq4#

总是回收器视图适配器有构造函数传递上下文不要传递这个getApplicationContext();
相反,键入当前上下文即示例。this

相关问题