Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在适配器类中调用自定义对话框_Android_Dialog_Android Recyclerview_Adapter - Fatal编程技术网

Android 在适配器类中调用自定义对话框

Android 在适配器类中调用自定义对话框,android,dialog,android-recyclerview,adapter,Android,Dialog,Android Recyclerview,Adapter,我已经创建了一个简单的自定义对话框类,我想在单击RecycleView中的一行后显示它。 我的对话类看起来: public class AddToQueueDialog extends Dialog implements View.OnClickListener { Activity mActivity; private TextView textView1; private TextView textView2; private Button save; public AddToQueu

我已经创建了一个简单的
自定义对话框
类,我想在单击
RecycleView
中的一行后显示它。 我的对话类看起来:

public class AddToQueueDialog extends Dialog implements View.OnClickListener {

 Activity mActivity;
private TextView textView1;
private TextView textView2;
private Button save;

public AddToQueueDialog(Activity activity){
    super(activity);
    mActivity = activity;
}

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.add_to_queue);
        textView1 = (TextView) findViewById(R.id.textView5);
        textView2 = (TextView) findViewById(R.id.textView6);
        save = (Button) findViewById(R.id.button4);
        save.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if(v.getId() == save.getId()){
            Log.d("save", "save");
        }
    }
}
我想知道如何正确调用
RecycleView的
adapter
,它看起来: (件)

公共类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
公共视图持有者(上下文上下文、视图项视图、列表位置){
超级(项目视图);
this.context=上下文;
info=(TextView)itemView.findViewById(R.id.TextView);
收藏夹=(按钮)itemView.findViewById(R.id.addToFav);
收藏夹.setOnClickListener(此);
info.setOnClickListener(此);
this.washLocations=washLocations;
dataBaseHelper=新的dataBaseHelper(上下文);
}
@凌驾
公共void onClick(视图v){
if(v.getId()==info.getId()){
AddToQueueDialog AddToQueueDialog=新建AddToQueueDialog(MapsActivity.this);
addToQueueDialog.show();
}
在我的
自定义对话框
类中,我需要arg中的
活动
作为构造函数,但我不知道应该在
适配器
类中传递哪个
活动
{
class MyAdapter extends RecyclerView.Adapter<VH> {

  // set this field through setter or constructor
  private OnClickListener mMyOnClickListener;

  ...

  void onBindViewHolder(..., VH viewHolder) {
    viewHolder.rootView.setOnClickListener(() -> {
       if (mOnClickListener != null) {
          mOnClickListener.onClick();
       }
     });
  }

  static class VH extends ViewHolder {
    View rootView;

    VH(View itemView) {
      super(itemView);
      rootView = itemView;
    }
  }
}

class MainActivity extends AppCompatActivity {

  ...

  void setUpRecyclerView(){
    ...
    adapter.setMyOnClickListener(() -> {
       new Dialog(MainActivity.this).show();
     });
  }
}
//通过setter或构造函数设置此字段 私有OnClickListener mmyoncClickListener; ... 在BindViewHolder上无效(…,VH viewHolder){ viewHolder.rootView.setOnClickListener(()->{ if(mOnClickListener!=null){ mOnClickListener.onClick(); } }); } 静态级VH扩展了可视支架{ 视图根视图; VH(查看项目视图){ 超级(项目视图); rootView=itemView; } } } 类MainActivity扩展了AppCompatActivity{ ... void setUpRecyclerView(){ ... adapter.setMyOnClickListener(()->{ 新建对话框(MainActivity.this.show(); }); } }
只需将当前
活动的
上下文
传递给
适配器
类,并在创建
AddToQueueDialog
实例时使用它即可

例如:

MainActivity.java

public class MainActivity extends AppCompatActivity {

    Context mContext;

    // Views
    RecyclerView mRecyclerView;

    // Values
    List<Recipe> mRecipeList;

    // Adapter
    RecipeAdapter mAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mContext = this;

        // Views
        mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);

        .................
        ..........................

        // Values
        mRecipeList = new ArrayList<Recipe>();

        // Adapter
        mAdapter = new RecipeAdapter(mContext, mRecipeList);

        // Set adapter to RecyclerView
        mRecyclerView.setAdapter(mAdapter);

        .................
        ..........................
   }
}  
public class RecipeAdapter extends RecyclerView.Adapter<RecipeAdapter.ViewHolder> {

    Context mContext;
    LayoutInflater mInflater;

    // List
    List<Recipe> mRecipeList;

    public GroupListAdapter(Context context, List<Recipe> listRecipe) {

        this.mContext = context;
        this.mRecipeList = listRecipe;

        mInflater = LayoutInflater.from(mContext);
    }

    .....................
    ...............................

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {       

        public ViewHolder(View itemView) {
            super(itemView);
            info = (TextView) itemView.findViewById(R.id.textView);
            favorite = (Button) itemView.findViewById(R.id.addToFav);

            favorite.setOnClickListener(this);
            info.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if(v.getId() == info.getId()){
                AddToQueueDialog addToQueueDialog = new AddToQueueDialog(mContext);
                addToQueueDialog.show();
            }
       }
    }

    ............
    ......................
}

希望这将有助于~

更好地通过接口回调从片段/activity调用dialog为什么?您可以发布一个示例吗?@bielas您需要传递当前运行的activity AddToQueueDialog AddToQueueDialog=new AddToQueueDialog((activity)context);AddToQueueDialog.show()的实例;@user3333848是的,我知道,但问题是我到底应该通过哪个活动?对不起,代码是从iPad上写的。你可以用带有参数的方法创建自己的接口,将任何参数从适配器传递到该接口方法中,并在活动中处理它们,或者只是触发一个事件,如我的示例中所示。我认为它与我的考试不匹配例如,在我的活动类中,我有一些逻辑连接到谷歌地图。在第二个类中,我有一个RecycleView和Adapter的实现。因此,我想有一个不同类的示例-一个用于活动,第二个用于RecycleView和Adapter。您是否愿意创建一个上面描述的示例?那么@AlexanderGoncharenko的问题solution@bielas,我已经做了,试着理解这个例子
public class RecipeAdapter extends RecyclerView.Adapter<RecipeAdapter.ViewHolder> {

    Context mContext;
    LayoutInflater mInflater;

    // List
    List<Recipe> mRecipeList;

    public GroupListAdapter(Context context, List<Recipe> listRecipe) {

        this.mContext = context;
        this.mRecipeList = listRecipe;

        mInflater = LayoutInflater.from(mContext);
    }

    .....................
    ...............................

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {       

        public ViewHolder(View itemView) {
            super(itemView);
            info = (TextView) itemView.findViewById(R.id.textView);
            favorite = (Button) itemView.findViewById(R.id.addToFav);

            favorite.setOnClickListener(this);
            info.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if(v.getId() == info.getId()){
                AddToQueueDialog addToQueueDialog = new AddToQueueDialog(mContext);
                addToQueueDialog.show();
            }
       }
    }

    ............
    ......................
}