java - java.lang.IndexOutOfBoundsException:索引:1,大小:1 错误?
问题描述
我的应用使用 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 答案中修复一些问题,但不明白我的代码出了什么问题,因为它运行良好并且突然似乎开始崩溃。如果这很重要,我删除了适配器中的标题。
解决方案
您的问题出在这段代码中:
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 开始。希望对您有所帮助!
推荐阅读
- python - 如何在 python folium 的图层之间使用 MarkerCluster?
- java - 无论我是否正确输入,Java 都没有运行我的扫描仪
- wordpress - 如何在我的帐户页面的 woocommerce 选项卡上添加图标?
- python - 使用 Twine 上传到 pypi 时出现断管错误
- c++ - 会员呼叫运营商<<
- python - python中的抓取类输出无或[]
- nativescript - nativescript-vue 的实现角度插件
- python-3.x - Beautiful Soup4 Find All 使用索引获取特定值
- assembly - 在 MIPS 程序集中将整数放在数组中的特定位置
- javascript - 如何将 Postgresql 时间戳转换为 Javascript 日期?