数组删除首先是从低位索引开始的?

时间:2019-09-19 07:40:42

标签: java android

我的应用程序位于前台。并且recyclerview列表中有2个项目。每当我从列表中删除第二项,然后单击第一项时,我的应用就会崩溃。在Logcat中,我收到类似-java.lang.IndexOutOfBoundsException: Index: 1, Size: 1的错误。但是,当我从列表中删除第一项,然后单击其余的第二项时,我的应用程序运行正常。

public void onClick(View v) {
    onClick.onItemCli(position, banners.get(position));
}

我尝试使用这种方法在位置-1进行尝试,如下面的代码所示。

public void onClick(View v) {
    onClick.onItemCli(position-1, banners.get(position-1));
}

但是在这种情况下,只要列表中有2个项目,我的应用程序就会崩溃,而我单击第2个项目。

我得到的错误是:

  

java.lang.ArrayIndexOutOfBoundsException:length = 12;索引= -1

public class HeaderSliderAdapter extends RecyclerView.Adapter<HeaderSliderAdapter.ViewHolder> {
    public List<Banner> banners;
    public Context context;
    private OnItemClicked onClick;


    public HeaderSliderAdapter(Context context, List<Banner> banners) {

        this.banners = banners;
        this.context = context;
    }

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

    @Override
    public void onBindViewHolder(final HeaderSliderAdapter.ViewHolder holder, final int position) {
        if (TextUtils.isEmpty(banners.get(position).getmSliderImage())) {
            holder.mSliderImageView.setImageResource(R.drawable.no_img_ava);
            holder.mBackgroundImage.setVisibility(View.GONE);
        } else {
            Picasso.with(context)
                    .load(banners.get(position).getmSliderImage())
                    .fit()
                    .into(holder.mSliderImageView, new Callback() {
                        @Override
                        public void onSuccess() {
                            holder.mBackgroundImage.setVisibility(View.GONE);
                            holder.tvWarningFailedtoLoad.setVisibility(View.GONE);
                            holder.tvTitle.setVisibility(View.VISIBLE);
                            holder.mSliderImageView.setClickable(true);
                        }

                        @Override
                        public void onError() {
                            holder.mBackgroundImage.setVisibility(View.GONE);
                            holder.tvWarningFailedtoLoad.setVisibility(View.VISIBLE);
                            holder.tvTitle.setVisibility(View.GONE);
                            holder.mSliderImageView.setClickable(false);

                        }
                    });
        }

       holder.mSliderImageView.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               onClick.onItemCli(position, banners.get(position));
           }
       });

    }

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

        public void setOnClick(OnItemClicked onClick) {
        this.onClick = onClick;
    }

    public interface OnItemClicked {
        void onItemCli(int position, Banner passData);
    }


    public class ViewHolder extends RecyclerView.ViewHolder {

        public ImageView mSliderImageView,mBackgroundImage;
        public TextView tvWarningFailedtoLoad;
        public TextView tvTitle;

        View mView;


        public ViewHolder(View itemView) {
            super(itemView);
            mView = itemView;

            mSliderImageView = mView.findViewById(R.id.mSliderImage);
            mBackgroundImage = mView.findViewById(R.id.backgroundImage);
            tvWarningFailedtoLoad = mView.findViewById(R.id.tvFailedtoLoad);
            tvTitle = mView.findViewById(R.id.mSliderImagetitle);
            tvTitle.setSelected(true);
            tvTitle.setSingleLine(true);

        }
    }

}

以下方法出错。

holder.mSliderImageView.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               onClick.onItemCli(position, banners.get(position));
           }
       });

java.lang.IndexOutOfBoundsException: Index: 1, Size: 1

1 个答案:

答案 0 :(得分:0)

我认为您问题的线索在documentation的以下部分:

  

请注意,与ListView不同的是,RecyclerView将不会在数据集中更改项目的位置时再次调用此方法,除非该项目本身无效或无法确定新位置。因此,在获取此方法内的相关数据项时,仅应使用position参数,而不应保留其副本。 如果以后需要某个物品的位置(例如,在单击侦听器中),请使用getAdapterPosition(),它将具有更新的适配器位置。如果Adapter可以处理有效的部分绑定,请改写onBindViewHolder(ViewHolder, int, List)

因此,请更改您的setOnClickListener()方法的实现,以使其不使用参数position,而是调用getAdapterPosition()来获取您的头寸的新值。