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);