【问题标题】:Handle click item in Recycleview处理 Recyclerview 中的点击项
【发布时间】:2023-03-22 03:43:01
【问题描述】:

我在vertical recycleview中有一个horizo​​ntal recycleview

我在 horizo​​ntal recycleview 中添加列表 cardview

在主Activity上点击item如何获取item信息?

谢谢

public class MainActivity extends AppCompatActivity {
        private RecyclerView recyclerView;
        private AlbumsVerticalAdapter adapter;
        private List<Album> albumList;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            initCollapsingToolbar();
            recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
            albumList = new ArrayList<>();
            adapter = new AlbumsVerticalAdapter(this, albumList);
            recyclerView.setHasFixedSize(true);
            recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
            recyclerView.setAdapter(adapter);
        }

        private void initCollapsingToolbar() {}

        private void prepareAlbums() {}
    }


public class AlbumsVerticalAdapter extends RecyclerView.Adapter<AlbumsVerticalAdapter.MyViewHolder> {

    private Context mContext;
    private List<Album> albumList;

    //.............

    @Override
    public void onBindViewHolder(final MyViewHolder holder, int position) {
        Album album = albumList.get(position);
        holder.title.setText(album.getName());
        AlbumsHorizontalAdapter itemListDataAdapter = new AlbumsHorizontalAdapter(mContext, albumList);
        holder.recycler_view_list.setHasFixedSize(true);
        holder.recycler_view_list.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false));
        holder.recycler_view_list.setAdapter(itemListDataAdapter);
    }

    @Override
    public int getItemCount() {
        return albumList.size();
    }
}

【问题讨论】:

标签: android android-recyclerview


【解决方案1】:

最好在你的ViewHolder 类上实现OnClickListener 并将监听器添加到你想要的视图中。

就像这样在onBindViewHolder(...) 添加setOnClickListener(...)

@Override
public void onBindViewHolder(WordViewHolder holder, final int position) {

    //... 

    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(v.getContext(), position + "", Toast.LENGTH_SHORT).show();
        }
    });
}

【讨论】:

    【解决方案2】:

    查看您的代码,VerticalRecyclerViewAdapter 有一个 List&lt;Albums&gt;,并且此列表中的每个专辑都需要一个 Horizo​​ntalRecyclerViewAdapter 来保存另一个 List&lt;Albums&gt;

    在您的 VerticalRecylerViewAdapter 中创建 VerticalClickListener,它将由您的活动实现。在 Horizo​​ntalRecyclerViewAdapter 内部创建 HorizontalClickListener,它将由您的 VerticalRecyclerViewAdapter 为每个专辑实现。在为每个专辑创建 Horizo​​ntalRecyclerViewAdapter 时,也传入 vertical 位置。然后,当点击卡片视图时,HorizontalClickListener 可以返回适配器的垂直位置以及卡片视图的水平位置。 VerticalRecyclerViewAdapter 会将垂直和水平位置返回给您的活动。

    【讨论】:

      【解决方案3】:

      首先,您创建一个类似的界面:

      public interface OnItemClickListener{
          void onItemClick(View view, int position)
      }
      

      声明全局:

      private OnItemClickListener mOnItemClickListener;
      

      接下来,你需要一个像这样的构造器:

      public MyAdapter(Context context, List data, OnItemClickListener mOnItemClickListener){
      //...
      this.mOnItemClickListener= mOnItemClickListener;
      

      }

      在 onBindViewHolder 中

      @Override
      public void onBindViewHolder(final FolderViewHolder holder, final int position) {
        //....
        holder.image.setOnClickListener(new View.OnItemClickListener){
              @Override
              public void onClick(View v) {
                  mOnItemClickListener.onItemClick(v,position);    
              }
          });
      

      }

      最后,您可以在类使用适配器中实现回调,例如:

      public class A extends AppCombatActivity implements MyAdapter.OnItemClickListener{
       //exist code
          @Override
          onItemClick(View view, int position){
           // Do something with view + position
        }
      
       }
      

      【讨论】:

      • 您好,感谢您的支持。但我想在水平 Recycleview 中获取 cardview 的位置
      【解决方案4】:
       /Just try to implement the below code Snippet/
      
       First make an Interface Class "RecyclerView_ItemClickListener"
      
       public interface RecyclerView_ItemClickListener
       {
        void onClick(View view, int position);
      
        void onItemClick(View view, int position);
       }
      
       Then use this class in your Activity/Fragment and  inside Adapter.
      
       How to Implement in Adapter class:
      
       private RecyclerView_ItemClickListener clickListener;
      
       public void setClickListener(RecyclerView_ItemClickListener itemClickListener)
       {
          this.clickListener = itemClickListener;
       }
      
       public void SetOnItemClickListener(final RecyclerView_ItemClickListener mItemClickListener)
       {
          this.clickListener = mItemClickListener;
       }
      
      Implement implements View.OnClickListener inside MyViewHolder Method 
      of Adapter
      
       Example like this: class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
      
      itemView.setOnClickListener(this);
      
      
      Then put the below code
      
      @Override
          public void onClick(View view)
          {
              if (clickListener != null)
              {
                  clickListener.onClick(view, getAdapterPosition());
      
                  clickListener.onItemClick(view,getAdapterPosition());
              }
          }
      
      After that implements RecyclerView_ItemClickListener inside your 
      Activity/Fragment
      
      in OnCreate:
      
      your_Adapter.setClickListener(this);
      
      your_Adapter.SetOnItemClickListener(this);
      
      @Override
      public void onClick(View view, int position)
      {}
      
      @Override
      public void onItemClick(View view, int position)
      {
      
      }
      

      【讨论】:

      • 您好,感谢您的支持。但我想在水平 Recycleview 中获取 cardview 的位置
      【解决方案5】:

      创建接口

      public interface OnItemClickListener{
          void onItemClick(View view, int position)
      }
      

      在适配器中添加参数化构造函数AlbumsVerticalAdapter

      private OnItemClickListener mOnviewItemClickListener;
      public AlbumsVerticalAdapter(Context context, List data, OnItemClickListener mOItemClickListener){
      //...
      this.mOnItemClickListener= mOnItemClickListener;
      

      现在在适配器类的 OnBinderViewHolder 方法中添加这一行

      @Override
      public void onBindViewHolder(final FolderViewHolder holder, final int position) {
        //....
        mholder.mimageview.setOnClickListener(new View.OnItemClickListener){
              @Override
              public void onClick(View v) {
                  mOnItemClickListener.onItemClick(v,position);    
              }
          });
      }
      

      在你的Activity中实现这个接口,使用item的onClick

       public class MainActivity extends AppCombatActivity implements AlbumsVerticalAdapter.OnItemClickListener{
              @Override
              onItemClick(View view, int position){
               // write your code 
            }
      
           }
      

      【讨论】:

      • 您好,感谢您的支持。但我想在水平 Recycleview 中获取 cardview 的位置
      猜你喜欢
      • 2020-03-18
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多