【问题标题】:RecyclerView : get position and switch to activityRecyclerView:获取位置并切换到活动
【发布时间】:2023-03-26 06:00:01
【问题描述】:

如何获得在RecyclerView 行中单击的项目的位置,而不是在onClick 方法中对活动进行意图? 这是我的适配器:

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

    private LayoutInflater inflater;
    List<Information> data= Collections.emptyList();

    public SergejAdapter(Context context, List<Information> data){
      inflater = LayoutInflater.from(context);
        this.data=data;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = inflater.inflate(R.layout.navigation_drawer_custom_row,parent,false);
        MyViewHolder holder= new MyViewHolder(view);
        return holder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        Information current=data.get(position);
        holder.title.setText(current.title);
    }

    @Override
    public int getItemCount() {
        return data.size();
    }
    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        TextView title;
        ImageView icon;

        public MyViewHolder(View itemView){
            super(itemView);
            title= (TextView) itemView.findViewById(R.id.listText);
            icon = (ImageView) itemView.findViewById(R.id.listIcon);
            icon.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            Context context = itemView.getContext();
            Intent intent = new Intent(context, Ernaehrung.class);
            context.startActivity(intent);

        }
    }

点击其中一张图片时,我只有一个onClick,但每张图片都有相同的意图。

【问题讨论】:

标签: android android-intent onclick onclicklistener android-recyclerview


【解决方案1】:

您可以使用getAdapterPosition() 方法从 ViewHolder 获取位置。就像下面的代码:

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

    ...

    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{


        @Override
        public void onClick(View v) {
            // here you use position
            int position = getAdapterPosition();
            ...

        }
    }
}

【讨论】:

  • 感谢您的快速回答!我用开关盒做的,效果很好。
  • 考虑到手动设置位置是多余的或更具体的不必要的工作。
  • 这是错误的。首先, ViewHolder 已经有一个位置,所以你不需要添加它。其次,onBind 的位置可能与 onClick 期间的位置不匹配(如果项目移动)。相反,请使用 ViewHolder#getPosition 获取最新位置。
  • getPosition() 现已弃用并替换为 getAdapterPosition()
  • getAdapterPosition() 工作:)
【解决方案2】:

或者你可以添加:

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

...
    class MyViewHolder extends RecyclerView.ViewHolder {

        public MyViewHolder (View itemView) {
            super(itemView);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Log.d(TAG, "Element " + getAdapterPosition() + " clicked.");
                }
            });
        }


    }

【讨论】:

    【解决方案3】:

    在您的onClick(View v) 中,您只需调用getLayoutPosition(),它将返回点击发生的位置。查看official docs 了解更多信息。

    所以你的代码应该是这样的:

    @Override
    public void onClick(View v) {
        switch(getLayoutPosition()){
           //TODO
        }
    }
    

    最好使用接口来处理点击。

    【讨论】:

    • getPosition() 已弃用。请改用getAdapterPosition()
    • @joaquin 不是getPosition(),我们现在有getLayoutPosition()getAdapterPosition()。如果您想获得相同的效果,您应该调用getLayoutPosition(),因为它映射到相同的方法存根。 getAdapterPosition() 做了一些不同的事情。
    • 感谢您提供的数据。我认为 getAdapterPosition() 具有相同的效果。
    • @joaquin 我会说 99% 的时间它会返回相同的值,但这就是文档对getAdapterPosition() 所说的:请注意,这可能与 getLayoutPosition( ) 如果有待处理的适配器更新但尚未发生新的布局传递。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 2022-01-02
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多