【问题标题】:RecyclerView Adapter onBind methodRecyclerView 适配器的 onBind 方法
【发布时间】:2019-03-15 10:07:13
【问题描述】:

我的 MainActivity 中有 3 个 RecyclerViews 。

其中一个在底部工作表中,它是主要工作表(默认情况下,底部工作表是 Open To Display this one ),在其适配器的onbind方法中我制作了一个 onClickListener 以便当用户点击其中的项目时,我想要,

我想回到主活动类来设置启动它滚动的方法是关闭底部工作表并设置下一个回收视图的数据(当底页已关闭)

.....这里的问题是如何从onBind方法的Listener启动这个方法,并给它一个来自这个viewHolder的参数作为它的名字和它的一些属性

如果有不清楚的地方请告诉我

@Override
public void onBindViewHolder(@NonNull final ViewHolder viewHolder, final int position) {

        viewHolder.categoryImage.setImageResource(mRowOfCategories.get(position).getCategoryImage());
        viewHolder.categoryName.setText(mRowOfCategories.get(position).getCategoryName());
        viewHolder.mCardView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {


            }
        });


    }

【问题讨论】:

  • 创建公共接口并在Activity中实现并在Adapter中制作setter的最佳简单方法,然后onClick用户侦听器对象将回调发送回Activity以执行特定操作。

标签: android android-recyclerview android-viewholder


【解决方案1】:

最简单:

您在 Activity 中声明要调用的方法。它必须是公开的:

public void method(){}

然后,在Adapter的Constructor中,将Activity的引用作为参数传递:

public MyAdapter(Activity activity){}

并且,在 onBindViewHolder 中:

MyActivity mActivity=(MyActivity)activity;
mActivity.method();

【讨论】:

    【解决方案2】:

    您可以轻松做到这一点。

    定义自定义接口

    public Interface CustomEventListener 
    {
         public void MyEventListener(String message); //you can change parameters
    }
    

    在您的适配器类中

     public Adapter ......... {
    
            private CustomEventListener listener;
    
            public void setListener(CustomEventListener listener)
            { 
                this.listener = listener;
            }
    
            //Your onBind
           Override
    public void onBindViewHolder(@NonNull final ViewHolder viewHolder, final int position) {
    
            viewHolder.categoryImage.setImageResource(mRowOfCategories.get(position).getCategoryImage());
            viewHolder.categoryName.setText(mRowOfCategories.get(position).getCategoryName());
            viewHolder.mCardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
    
                      if (listener != null)
                            listener.MyEventListener("Message");
                }
            });    
        }
    

    }

    在创建适配器时在您的 Activity 中添加此代码

     public void InitAdapter()
    {
    
      yourAdapter = new Adapter(); // bloa bla bla   
      yourAdapter.setListener(new CustomEventListener()  {
          public void MyEventListener(String message)
          {
               // then do what you want
          }   
     }
    }
    

    【讨论】:

      【解决方案3】:

      您需要使用 Listener 来处理适配器中的点击,如下所示:

      private OnItemClickListener mListener;
      
      public interface OnItemClickListener {
          void onItemClick(View view, int position);
      }
      
      public void setOnItemClickListener(OnItemClickListener listener) {
          this.listener = listener;
      }
      

      然后调用监听器:

      @Override
      public void onBindViewHolder(@NonNull final ViewHolder viewHolder, final int position) {
      
          ...
      
          viewHolder.mCardView.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                 // call the listener.
                 mListener.onItemClick(v, viewHolder.getAdapterPosition());
              }
          });
      }
      

      然后,当您使用适配器时,请使用以下内容设置侦听器:

      adapter.setOnItemClickListener(new OnItemClickListener() {
          public void onItemClick(View view, int position) {
      
             // do something with the view and position.
          }
      });
      

      【讨论】:

        【解决方案4】:

        您希望您的回收视图能够相互了解。您将需要一个类,也许是 MainActivity,它将保留选定的值,并根据请求在 recycleviews 之间清除它。然后,您将需要该值来传播下一个回收视图。如果您想提高效率,那么您将使用一个回收视图并在选择之间交换数据,并对其进行动画处理,使其看起来像是创建了一个新的回收视图。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-02-22
          • 1970-01-01
          • 1970-01-01
          • 2018-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多