Android RecyclerView-如何将onBindViewHolder的位置传递给我的ViewHolder类?

Android RecyclerView-如何将onBindViewHolder的位置传递给我的ViewHolder类?,android,android-recyclerview,Android,Android Recyclerview,我试图在ViewHolder类中设置onClickListeners,但我需要每个监听器的位置。如何将位置从onBindViewHolder传递到我的 收视率等级 @NonNull @Override public AdapterAllComments.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { View view = LayoutInflater.from(viewGroup.getConte

我试图在ViewHolder类中设置onClickListeners,但我需要每个监听器的位置。如何将位置从onBindViewHolder传递到我的 收视率等级

@NonNull
@Override
public AdapterAllComments.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.model_rv_allcomments_container, viewGroup, false);

    return new ViewHolder(view);
}

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


}

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

public class ViewHolder extends RecyclerView.ViewHolder{



    LinearLayout viewHolderLayout;


    public ViewHolder(@NonNull View itemView) {
        super(itemView);

        viewHolderLayout = itemView.findViewById(R.id.item_child_layout);

    }
}

使用ViewHolders
getAdapterPosition()
获取ViewHolder的当前位置。

使用ViewHolders
getAdapterPosition()
获取ViewHolder的当前位置。

我的其他项目中的此适配器:

    public class ChildrenRvAdapter extends RecyclerView.Adapter<ChildrenRvAdapter.ViewHolder> {

    private List<String> mData;
    private LayoutInflater mInflater;
    private ItemClickListener mClickListener;
    private Context context;

    public ChildrenRvAdapter(Context context, List<String> data) {
        this.mInflater = LayoutInflater.from(context);
        this.mData = data;
        this.context = context;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.children_rv_row, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        String name = mData.get(position);
        holder.tv_name.setText(name);
        setAnimation(holder.itemView, position);
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView tv_name;
        Button btn_remove;

        ViewHolder(View itemView) {
            super(itemView);
            tv_name = itemView.findViewById(R.id.tv_name);
            btn_remove = itemView.findViewById(R.id.btn_remove);
            btn_remove.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
        }
    }

    String getItem(int id) {
        return mData.get(id);
    }

    public void setClickListener(ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }

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

    }
}
请注意,我在
按钮上设置了它,但您可以在
项目视图上设置它
另外,在任何具有
设置ClickListener
视图上,您可以使用:

itemView.setOnClickListener(这个)

然后,从您的活动或片段以及使用适配器的任何位置,只需将
onlick
接口
执行,并在初始化适配器后,使用我们在适配器中创建的
public void setClickListener
方法,将其应用到适配器中的本地接口

 public void setClickListener(ItemClickListener itemClickListener) {
    this.mClickListener = itemClickListener;
}
活动:

public class ChildrenEditDialog extends Dialog implements IChildren.IView, ChildrenRvAdapter.ItemClickListener
在活动
onCreate
或其他地方:

 childrenRvAdapter = new ChildrenRvAdapter(c, dataSource);
    childrenRvAdapter.setClickListener(this);

您的活动/片段/对话框等中只有onlick…

此适配器来自我的另一个项目:

    public class ChildrenRvAdapter extends RecyclerView.Adapter<ChildrenRvAdapter.ViewHolder> {

    private List<String> mData;
    private LayoutInflater mInflater;
    private ItemClickListener mClickListener;
    private Context context;

    public ChildrenRvAdapter(Context context, List<String> data) {
        this.mInflater = LayoutInflater.from(context);
        this.mData = data;
        this.context = context;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.children_rv_row, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        String name = mData.get(position);
        holder.tv_name.setText(name);
        setAnimation(holder.itemView, position);
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView tv_name;
        Button btn_remove;

        ViewHolder(View itemView) {
            super(itemView);
            tv_name = itemView.findViewById(R.id.tv_name);
            btn_remove = itemView.findViewById(R.id.btn_remove);
            btn_remove.setOnClickListener(this);
        }

        @Override
        public void onClick(View view) {
            if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
        }
    }

    String getItem(int id) {
        return mData.get(id);
    }

    public void setClickListener(ItemClickListener itemClickListener) {
        this.mClickListener = itemClickListener;
    }

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

    }
}
请注意,我在
按钮上设置了它,但您可以在
项目视图上设置它
另外,在任何具有
设置ClickListener
视图上,您可以使用:

itemView.setOnClickListener(这个)

然后,从您的活动或片段以及使用适配器的任何位置,只需将
onlick
接口
执行,并在初始化适配器后,使用我们在适配器中创建的
public void setClickListener
方法,将其应用到适配器中的本地接口

 public void setClickListener(ItemClickListener itemClickListener) {
    this.mClickListener = itemClickListener;
}
活动:

public class ChildrenEditDialog extends Dialog implements IChildren.IView, ChildrenRvAdapter.ItemClickListener
在活动
onCreate
或其他地方:

 childrenRvAdapter = new ChildrenRvAdapter(c, dataSource);
    childrenRvAdapter.setClickListener(this);

您的活动/片段/对话框等中只有一个链接。

可以使用onBindViewHolder到ViewHolder类的当前位置
getAdapterPosition()

例如,

public class ViewHolder extends RecyclerView.ViewHolder{
    LinearLayout viewHolderLayout;

    viewHolderLayout = itemView.findViewById(R.id.item_child_layout);

    public ViewHolder(@NonNull View itemView) {
        super(itemView);

        viewHolderLayout.setOnClickListener(v -> {
            lastClickedPosition = getAdapterPosition();
        });

    }
}

要获取onBindViewHolder到ViewHolder类的当前位置,可以使用
getAdapterPosition()

例如,

public class ViewHolder extends RecyclerView.ViewHolder{
    LinearLayout viewHolderLayout;

    viewHolderLayout = itemView.findViewById(R.id.item_child_layout);

    public ViewHolder(@NonNull View itemView) {
        super(itemView);

        viewHolderLayout.setOnClickListener(v -> {
            lastClickedPosition = getAdapterPosition();
        });

    }
}

你为什么要这么做。也许有更好的方法来完成你想要完成的事情。是的,通过这个.getAdapterPosition()@lvl4fi4可以做到这一点,因为我想在viewHolder中设置一个onclickListener,以使用viewHolder的位置从数组中获取索引。如果您只需要onclick项,那么您可以使用接口。我会把它贴在answer@lvl4fi4在onBindViewHolder中设置OnClickListeners是一种不好的做法吗?这就是我目前正在做的是的,这不是一个正确的方法,为什么你要这么做。也许有更好的方法来完成你想要完成的事情。是的,通过这个.getAdapterPosition()@lvl4fi4可以做到这一点,因为我想在viewHolder中设置一个onclickListener,以使用viewHolder的位置从数组中获取索引。如果您只需要onclick项,那么您可以使用接口。我会把它贴在answer@lvl4fi4在onBindViewHolder中设置OnClickListeners是一种不好的做法吗?这就是我目前正在做的是的,这不是一种正确的做法