Мое приложение отображает видеопотоки в моем приложении с помощью 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, но не смог понять, что пошло не так с моим кодом, учитывая, что он работает хорошо, и вдруг кажется, что начал сбой. Я удалил заголовок в адаптере, если это имеет значение.