RecyclerView несколько раз вызывает свои методы при 1 элементе
Сделал RecyclerViewAdapter для нескольких элементов(ссылка и папка) и он начал багованно работать, а именно многоразово вызывать методы getItemCount(2 раза логи проходят,2 раза вызывается) и getItemViewType(тупо 2 раза вызывается) , хотя у меня в дате только 1 обьект подходит по условиям для адаптера. Есть похожий адаптер,но только для папок в MainActivity, без разных элементов, там все прекрасно работает,хотя размер считает вообще 3 раза по логам за один цикл адаптера...
viewType определяет какой обьект создавать(0 - папка, 1 - ссылка). Не смог придумать ничего лучше костыля в виде переменной j для использования метода getPosOfItem, который выводит элементы с нужным мне parentId по одной штуке за цикл адаптера. Это и есть причина краша, при втором вызове j = 1, а в методе только одно значение, ну и соответственно индекса больше 0 там быть не может, если у меня подходит только 1 элемент.
Как эту проблему решить? Если j = 0 всегда,то вопросов еще больше, цикл запускается аж 4 раза(напомню, у меня только 1 подходящий элемент и это определяется на самом первом методе), но для чего - не понятно.
public class RecyclerViewLinkAdapter extends RecyclerView.Adapter<RecyclerViewLinkAdapter.ViewHolder> {
Context context;
int favicons[];
int ParentId;
int j = 0;
public RecyclerViewLinkAdapter(Context cont, ArrayList<MyData> links, int parentId, int favics[]){
context = cont;
MyApp.appInstance.linksData = links;
favicons = favics;
ParentId = parentId;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
if (viewType == 0) { //folder
LayoutInflater FolderInflater = LayoutInflater.from(context);
View FolderView = FolderInflater.inflate(R.layout.folder_layout, parent, false);
return new ViewHolder(FolderView, viewType);
}
else{ //link
LayoutInflater LinkInflater = LayoutInflater.from(context);
View LinkView = LinkInflater.inflate(R.layout.link_layout, parent, false);
return new ViewHolder(LinkView, viewType);
}
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
position = getPosition();
j++;
if (MyApp.appInstance.linksData.get(position).getURL().isEmpty()) {
holder.folder_name.setText(MyApp.appInstance.linksData.get(position).getTitle());
holder.foldericon.setImageResource(favicons[1]);
holder.foldercard.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
CreateHintWindow();
return true;
}
});
holder.foldercard.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
}
else {
holder.link_name.setText(MyApp.appInstance.linksData.get(position).getTitle());
holder.linkicon.setImageResource(favicons[0]);
holder.linkcard.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
CreateHintWindow();
return true;
}
});
holder.linkcard.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
}
}
@Override
public int getItemCount() {
int size = MyApp.appInstance.getItemsCount(ParentId);
return size;
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView link_name, folder_name;
ImageView linkicon, foldericon;
CardView linkcard, foldercard;
public ViewHolder(@NonNull View itemView, int viewType) {
super(itemView);
if (viewType == 0){
folder_name = itemView.findViewById(R.id.Folder_Title);
foldericon = itemView.findViewById(R.id.Folder_Icon);
foldercard = itemView.findViewById(R.id.FolderCardView);
}
else {
link_name = itemView.findViewById(R.id.Link_Title);
linkicon = itemView.findViewById(R.id.Link_Icon);
linkcard = itemView.findViewById(R.id.LinkCardView);
}
}
}
@Override
public int getItemViewType(int position) {
position = getPosition();
int viewType;
if (MyApp.appInstance.linksData.get(position).getURL().isEmpty()){
viewType = 0; //folder
}
else {
viewType = 1; //link
}
return viewType;
}
public int getPosition() {
position = MyApp.appInstance.getPosOfItem(ParentId, j);
return position;
}
}