【问题标题】:Call custom dialog in Adapter class在适配器类中调用自定义对话框
【发布时间】:2017-05-05 16:49:35
【问题描述】:

我创建了一个简单的Custom dialog 类,我想在单击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");
        }
    }
}

我想知道如何正确调用 adapterRecycleView 看起来: (片)

   public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {       
        public ViewHolder(Context context, View itemView, List<WashLocation> washLocations) {
            super(itemView);
            this.context = context;
            info = (TextView) itemView.findViewById(R.id.textView);
            favorite = (Button) itemView.findViewById(R.id.addToFav);
            favorite.setOnClickListener(this);
            info.setOnClickListener(this);
            this.washLocations = washLocations;
            dataBaseHelper = new DataBaseHelper(context);
        }

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

在我的 Custom dialog 类中,我需要一个 Activity in arg 作为构造函数,但我不知道应该在 Adapter 类中传递哪个 Activity

【问题讨论】:

  • 通过接口回调更好地从片段/活动调用对话框
  • 为什么?可以举个例子吗?
  • @bielas 您需要传递当前正在运行的活动的实例 AddToQueueDialog addToQueueDialog = new AddToQueueDialog((Activity)context); addToQueueDialog.show();
  • @user3333848 是的,我知道,但问题是我应该通过哪个 Activity?

标签: android dialog android-recyclerview adapter


【解决方案1】:

只需将当前Activitycontext 传递给Adapter 类,并在创建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);

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

RecipeAdapter.java

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();
            }
       }
    }

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

希望对你有帮助~

【讨论】:

    【解决方案2】:
    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();
         });
      }
    }
    

    【讨论】:

    • 对不起代码,是从 iPad 上写的。您可以使用带有参数的方法创建自己的接口,将任何参数从适配器传递到该接口方法并在 Activity 中处理它们,或者像我的示例中那样触发事件
    • 嗯,我认为它与我的示例不匹配。在我的活动课程中,我有一些与谷歌地图相关的逻辑。在第二类中,我有一个 RecycleView 和 Adapter 的实现。那么我想举一个不同类的例子——一个用于活动,第二个用于 RecycleView 和 Adapter。你会这么好心并创建一个上述描述的例子吗?
    • 那么@AlexanderGoncharenko 的解决方案有什么问题
    • @bielas,我已经完成了,试着理解这个例子
    猜你喜欢
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多