繁体   English   中英

java.lang.IndexOutOfBoundsException:索引:1,大小:1 错误?

[英]java.lang.IndexOutOfBoundsException: Index: 1, Size: 1 error?

我的应用使用 recyclerview 在我的应用中显示视频提要。 它似乎已经开始突然崩溃了,我无法解决这个问题。

我的适配器:

public class VideosAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener {

    private ArrayList<Object> data = new ArrayList<>();
    private Context context;
    private int lastItemPosition = -1;
    private final int VIEW_TYPE_LIST = 0;
    private final int VIEW_TYPE_LOADER = 1;
    private final int VIEW_TYPE_NETWORK_ERROR = 2;
    private final int VIEW_TYPE_AD = 3;
    private boolean isLoading = false;
    private LoadMoreListener loadMoreListener;
    private int visibleThreshold = 2;
    private int lastVisibleItem, totalItemCount;

    private VideoListener videoListener;


    public VideosAdapter(Context context, RecyclerView mRecyclerView, VideoListener videoListener) {
      this.context=context;
      this.videoListener = videoListener;
        final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
        mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                LocalMessageManager.getInstance().send(R.id.recyclerview_scroll);
                assert linearLayoutManager != null;
                totalItemCount = linearLayoutManager.getItemCount();
                lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition();
                int firstVisibleItem = linearLayoutManager.findFirstVisibleItemPosition();

                if ((firstVisibleItem + Constants.ADS.NUMBER_OF_ITEMS_BEFORE_REQUEST_AD) % Constants.ADS.LOAD_ADS_AT_POSITION == 0){
                    //
                    int pos = firstVisibleItem + Constants.ADS.NUMBER_OF_ITEMS_BEFORE_REQUEST_AD;
                    if(pos > lastItemPosition && data.size()>pos && data.get(pos - 1) != null) {
                        if (!(data.get(pos) instanceof NativeAd)) {
                            videoListener.requestAds(pos);
                        }
                    }
                }

                if (!isLoading && NetworkUtil.hasConnection(context)) {
                    if (totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                        if (loadMoreListener != null) {
                            loadMoreListener.onLoadMore();
                        }
                        isLoading = true;
                    }
                }
            }
        });
    }

    @Override
    public int getItemViewType(int position) {
        if(data.get(position) instanceof Error)return VIEW_TYPE_NETWORK_ERROR;
        if(data.get(position) == null)return VIEW_TYPE_LOADER;
        if(data.get(position) instanceof NativeAd)return VIEW_TYPE_AD;
        return VIEW_TYPE_LIST;
    }

    public void setData(ArrayList<Object> objectList) {
        this.data.clear();
        this.data.addAll(objectList);
        this.notifyDataSetChanged();
    }

    public void setMoreData(ArrayList<Videos> videos) {
        data.addAll(videos);
        this.notifyDataSetChanged();
    }

    public void setAd(NativeAd ad, int pos) {
        if(!(pos>data.size())) {
            data.add(pos, ad);
            this.notifyItemInserted(pos);
        }
    }


    @Override
    public int getItemCount() {
        return data != null ? data.size() : 0;
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, final int position) {
        lastItemPosition = position;
        switch (holder.getItemViewType()) {
            case VIEW_TYPE_LIST:
                final VideoViewHolder viewHolder = (VideoViewHolder) holder;
                viewHolder.bindTo((Videos) data.get(position));
                break;
            case VIEW_TYPE_LOADER:
                final ViewLoader viewLoader = (ViewLoader) holder;
                viewLoader.rotateLoading.start();
                break;
            case VIEW_TYPE_NETWORK_ERROR:
                StaggeredGridLayoutManager.LayoutParams layoutParams = new StaggeredGridLayoutManager.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
                layoutParams.setFullSpan(true);
                holder.itemView.setLayoutParams(layoutParams);

                ViewError viewError = (ViewError) holder;
                if(SharedPrefernces.getUseNightMode()){
                    viewError.img.setColorFilter(App.getContext().getResources().getColor(R.color.white));
                }else{
                    viewError.img.setColorFilter(App.getContext().getResources().getColor(R.color.black));
                }
                break;
            case VIEW_TYPE_AD:
                final AdsViewHolder adsViewHolder = (AdsViewHolder) holder;
                NativeAd nativeAd = (NativeAd)data.get(position);
                adsViewHolder.bind(nativeAd);
                break;
        }
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int i) {
        RecyclerView.ViewHolder viewHolder = null;
        LayoutInflater inflater = LayoutInflater.from(context);
        switch (i) {
            case VIEW_TYPE_LIST:
                View va;
                if(SharedPrefernces.get_feed_type()==0){
                    va = inflater.inflate(R.layout.large_image_video_list, parent, false);
                }else{
                    va = inflater.inflate(R.layout.video_list, parent, false);
                }
                viewHolder = new VideoViewHolder(va, videoListener);
                break;
            case VIEW_TYPE_LOADER:
                View ld = inflater.inflate(R.layout.loader, parent, false);
                viewHolder = new ViewLoader(ld);
                break;
            case VIEW_TYPE_NETWORK_ERROR:
                View ne = inflater.inflate(R.layout.no_video_stories, parent, false);
                viewHolder = new ViewError(ne);
                break;
            case VIEW_TYPE_AD:
                View ads = inflater.inflate(R.layout.ad_item_large, parent, false);
                viewHolder = new AdsViewHolder(ads);
                break;
        }

        return viewHolder;
    }

    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.pin:
                break;
            case R.id.share:
                break;
        }
    }

    public class ViewLoader extends RecyclerView.ViewHolder {
        private RotateLoading rotateLoading;

        ViewLoader(View view) {
            super(view);
            rotateLoading = (RotateLoading) view.findViewById(R.id.rotateloading);
        }
    }

    public class ViewError extends RecyclerView.ViewHolder {
        private ImageView img;

        ViewError(View view) {
            super(view);
            img = view.findViewById(R.id.img);
        }
    }

    public void setLoaded(){
        data.remove(data.size()-1);
        this.notifyItemRemoved(data.size()-1);
        isLoading = false;
    }

    public void setLoadMoreListener(LoadMoreListener loadMoreListener) {
        this.loadMoreListener = loadMoreListener;
    }

    public void setLoader(){
        data.add(null);
        this.notifyItemInserted(data.size()-1);
    }
}

设置此适配器并引发错误的片段中的代码:

        recyclerView = (RecyclerView) layout.findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new GridLayoutManager(getActivity(), 1));
        adapter = new VideosAdapter(getActivity(),recyclerView,this);

        adapter.setLoadMoreListener(() -> recyclerView.post(() -> {
            if(data.size()> 0 && data.get(1) instanceof Videos){
                adapter.setLoader();
                loadMoreFeeds();
            }
        }));
        recyclerView.setAdapter(adapter);

错误日志:

java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
        at java.util.ArrayList.get(ArrayList.java:437)

我尝试从其他 SOF 答案中修复一些问题,但不明白我的代码出了什么问题,因为它运行良好并且突然似乎开始崩溃。 如果这很重要,我在适配器中删除了 header。

您的问题出在这段代码中:

adapter.setLoadMoreListener(() -> recyclerView.post(() -> {
        if(data.size()> 0 && data.get(1) instanceof Videos){
            adapter.setLoader();
            loadMoreFeeds();
        }
    }));

您正在检查数组的length是否大于0 ,但这意味着也可能只有一个元素。 因此,您应该将此行更改为:

 if(data.size() > 0 && data.get(0) instanceof Videos)

或者:

 if(data.size() > 1 && data.get(1) instanceof Videos)

请记住,数组中的元素计数从 0 开始。希望对您有所帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM