Java 视窗支架';s getAdapterPosition和getLayoutPosition始终为-1

Java 视窗支架';s getAdapterPosition和getLayoutPosition始终为-1,java,android,android-recyclerview,Java,Android,Android Recyclerview,我有以下AssessmentAdapter类。在我的ViewHolder类的constructor中,我findViewById()使用删除图标获取ImageView,并将单击事件分配给它 我试图找到我的ViewHolder的位置,并将其发送给我的OnDeleteIconClicked类的参数化构造函数,但位置始终是-1。为什么? 这是我的密码: public class AssessmentAdapter extends RecyclerView.Adapter<AssessmentAd

我有以下
AssessmentAdapter
类。在我的
ViewHolder
类的
constructor
中,我
findViewById()
使用删除图标获取
ImageView
,并将单击事件分配给它

我试图找到我的ViewHolder的位置,并将其发送给我的
OnDeleteIconClicked
类的参数化构造函数,但位置始终是
-1
。为什么?

这是我的密码:

public class AssessmentAdapter extends RecyclerView.Adapter<AssessmentAdapter.AssessmentViewHolder> {

private List<Assessment> assessmentList;
private IAssessmentsList context;

public AssessmentAdapter(List<Assessment> assessmentList, IAssessmentsList context){
    this.assessmentList = assessmentList;
    this.context = context;
}

@Override
public AssessmentViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View rowView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.assessment_list_row, parent, false);

    rowView.setOnClickListener(new OnAdapterItemClicked());

    return new AssessmentViewHolder(rowView);
}

@Override
public void onBindViewHolder(AssessmentViewHolder holder, int position) {
    Assessment assessment = assessmentList.get(position);
    holder.txtClientName.setText(assessment.getClient());
    holder.txtAssessmentDate.setText(assessment.getInspectedDate());
    holder.imageView.setTag(assessment.getId());
}

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

public class AssessmentViewHolder extends RecyclerView.ViewHolder{

    public TextView txtClientName, txtAssessmentDate;
    public ImageView imageView;

    public AssessmentViewHolder(View view){
        super(view);

        txtClientName = view.findViewById(R.id.txtClientName);
        txtAssessmentDate = view.findViewById(R.id.txtAssessmentDate);

        imageView= view.findViewById(R.id.deleteAssessment);
        int layoutPosition = getLayoutPosition(); //always -1
        int adapterPosition = getAdapterPosition(); //always -1
        imageView.setOnClickListener(new OnDeleteIconClicked(getAdapterPosition()));
    }
}

public class OnAdapterItemClicked implements View.OnClickListener{

    @Override
    public void onClick(View v) {
        context.OnAdapterItemClicked(v);
    }
}
public class OnDeleteIconClicked implements View.OnClickListener {

    private int position;

    public OnDeleteIconClicked(int position){
        this.position = position;
    }

    @Override
    public void onClick(View v) {
        context.OnDeleteItemClicked(Integer.parseInt(v.getTag().toString()), position);
    }

    public int getPosition() {
        return position;
    }
    public void setPosition(int position) {
        this.position = position;
    }
}
}
公共类评估适配器扩展了RecyclerView.Adapter{
私人名单评估名单;
私人IAssessmentsList上下文;
公共评估适配器(列表评估列表、IAssessmentsList上下文){
this.assessmentList=assessmentList;
this.context=上下文;
}
@凌驾
公共评估ViewHolder onCreateViewHolder(视图组父级,int-viewType){
View rowView=LayoutInflater.from(parent.getContext())
.充气(R.layout.assessment\u list\u row,parent,false);
setOnClickListener(新的OnAdapterItemClicked());
返回新的评估视图持有者(rowView);
}
@凌驾
BindViewHolder上的公共无效(评估ViewHolder,内部位置){
评估=评估列表。获取(位置);
holder.txtClientName.setText(assessment.getClient());
holder.txtAssessmentDate.setText(assessment.getInspectedDate());
holder.imageView.setTag(assessment.getId());
}
@凌驾
public int getItemCount(){
返回评估列表。大小();
}
公共类评估ViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图txtClientName、txtaccessmentdate;
公共影像视图;
公共评估视图持有人(视图){
超级(视图);
txtClientName=view.findviewbyd(R.id.txtClientName);
txtAssessmentDate=view.findViewById(R.id.txtAssessmentDate);
imageView=view.findViewById(R.id.deleteAssessment);
int layoutPosition=getLayoutPosition();//始终为-1
int adapterPosition=getAdapterPosition();//始终为-1
setOnClickListener(新的OnDeleteIconClicked(getAdapterPosition());
}
}
AdapterItemClicked上的公共类实现了View.OnClickListener{
@凌驾
公共void onClick(视图v){
上下文。OnAdapterItemClicked(v);
}
}
OnDeleteIconClicked公共类实现View.OnClickListener{
私人职位;
公共OnDeleteIconClicked(内部位置){
这个位置=位置;
}
@凌驾
公共void onClick(视图v){
context.OnDeleteItemClicked(Integer.parseInt(v.getTag().toString()),位置);
}
public int getPosition(){
返回位置;
}
公共无效设置位置(内部位置){
这个位置=位置;
}
}
}
OnDeleteIconClicked中的更改 }

OnDeleteIconClicked中的更改 }

将上面的线放在BindViewHolder内,如下所示:

@Override
public void onBindViewHolder(AssessmentViewHolder holder, int position) {
    Assessment assessment = assessmentList.get(position);
    holder.txtClientName.setText(assessment.getClient());
    holder.txtAssessmentDate.setText(assessment.getInspectedDate());
    holder.imageView.setTag(assessment.getId());
    holder.imageView.setOnClickListener(new OnDeleteIconClicked(position));
}
将上面的线放在BindViewHolder内,如下所示:

@Override
public void onBindViewHolder(AssessmentViewHolder holder, int position) {
    Assessment assessment = assessmentList.get(position);
    holder.txtClientName.setText(assessment.getClient());
    holder.txtAssessmentDate.setText(assessment.getInspectedDate());
    holder.imageView.setTag(assessment.getId());
    holder.imageView.setOnClickListener(new OnDeleteIconClicked(position));
}
但是位置总是-1。为什么?

getAdapterPosition()当recyclerview进行布局计算时,它将始终返回-1。您正在
ViewHolder
中调用此方法。。这意味着RecyclerView正在进行计算

如果需要在视图的单击操作中定位

inside ViewHolder { ....
...
view.setOnClickListener(new View.OnClickListener) {
        @Override
        public void onClick(View v) {
             int position = getAdapterPosition(); // This does not return -1, because calculation is done and views have been inflated.
        }
    }
);
....
}
但是位置总是-1。为什么?

getAdapterPosition()当recyclerview进行布局计算时,它将始终返回-1。您正在
ViewHolder
中调用此方法。。这意味着RecyclerView正在进行计算

如果需要在视图的单击操作中定位

inside ViewHolder { ....
...
view.setOnClickListener(new View.OnClickListener) {
        @Override
        public void onClick(View v) {
             int position = getAdapterPosition(); // This does not return -1, because calculation is done and views have been inflated.
        }
    }
);
....
}

将单击事件放在onBindViewHolder中

holder.imageView.setOnClickListener(new OnDeleteIconClicked(position));

将单击事件放在onBindViewHolder中

holder.imageView.setOnClickListener(new OnDeleteIconClicked(position));
getAdapterPosition();当recyclerview进行布局计算时,它将始终返回-1。您正在ViewHolder内调用此方法。。这意味着RecyclerView正在进行计算

如果您需要在视图的单击操作中定位,请在public void onClick(final view v)方法中调用它,例如:

“@覆盖 public void onBindViewHolder(@NonNull final ViewHolder,final int position){

但不是 getAdapterPosition();当recyclerview进行布局计算时,它将始终返回-1。您正在ViewHolder内调用此方法。这意味着recyclerview正在进行计算

如果您需要在视图的单击操作中定位,请在public void onClick(final view v)方法中调用它,例如:

@凌驾 public void onBindViewHolder(@NonNull final ViewHolder,final int position){

getAdapterPosition();当recyclerview进行布局计算时,它将始终返回-1。您正在ViewHolder内调用此方法。这意味着recyclerview正在进行计算

如果您需要在视图的单击操作中定位,请在public void onClick(final view v)方法中调用它,例如:

“@覆盖 public void onBindViewHolder(@NonNull final ViewHolder,final int position){

但不是 getAdapterPosition();当recyclerview进行布局计算时,它将始终返回-1。您正在ViewHolder内调用此方法。这意味着recyclerview正在进行计算

如果您需要在视图的单击操作中定位,请在public void onClick(final view v)方法中调用它,例如:

@凌驾 public void onBindViewHolder(@NonNull final ViewHolder,final int position){


我看不出这将如何工作?您的代码的格式也不正确检查更新代码。我复制了您的代码,仅对代码进行了更改。我看不出这将如何工作?您的代码的格式也不正确检查更新代码。我复制了您的代码,仅对代码进行了更改,以供您解释。我避免将我的设置为开ClickListeners正如您在上面所显示的,对我个人来说,这使我的代码看起来
    final Students user = mUsers.get(position);
    holder.Name.setText(user.getFullname());
    holder.Index.setText(user.getIndex_number());


    if (user.getThumbnail().equals("default")) {
        holder.profile_image.setImageResource(R.drawable.profile_pic);
    } else {
        Picasso.get().load(user.getThumbnail())
                .placeholder(R.drawable.profile_pic)
                .into(holder.profile_image);
    }

  holder.itemView.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(final View v) {
           **list_user_id = mUsers.get(position).getId();**

           Intent Sub = new Intent(mContext, UserProfileActivity.class);
           Sub.putExtra("user_id1", list_user_id);
           mContext.startActivity(Sub);
    final Students user = mUsers.get(position);
    holder.Name.setText(user.getFullname());
    holder.Index.setText(user.getIndex_number());

**list_user_id = mUsers.get(position).getId();**



    if (user.getThumbnail().equals("default")) {
        holder.profile_image.setImageResource(R.drawable.profile_pic);
    } else {
        Picasso.get().load(user.getThumbnail())
                .placeholder(R.drawable.profile_pic)
                .into(holder.profile_image);
    }

  holder.itemView.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(final View v) {

           Intent Sub = new Intent(mContext, UserProfileActivity.class);
           Sub.putExtra("user_id1", list_user_id);
           mContext.startActivity(Sub);