我的搜索有一个recyclerview,我想将所有项目添加到它。我有 5个模型我写的数据。
此代码到目前为止,但它只显示前2项只有2请你能告诉我什么错了吗?
我的适用于recyclerView代码的适配器:
@Override
public int getItemViewType(int position) {
if (models.getEvents().size() >= position && position >= 0){
code = 0;
}else if (position > models.getEvents().size() && position <= (models.getEvents().size()+models.getNews().size())){
code = 1;
}else if (position > (models.getNews().size()+models.getEvents().size()) && position <=
(models.getEvents().size()+models.getNews().size()+models.getMemes().size())){
code =2;
}else if (position >(models.getEvents().size()+models.getNews().size()+models.getMemes().size())
&& position <= (models.getNews().size()+models.getEvents().size()+models.getMemes().size()+models.getExSites().size())){
code = 3;
}else if (position >(models.getNews().size()+models.getEvents().size()+models.getMemes().size()+models.getExSites().size()) &&position <=
(models.getNews().size()+models.getEvents().size()+models.getMemes().size()+models.getExSites().size()+models.getTwitch().size())){
code =4;
}
return code;
}
@Override
public SearchViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType){
case 0:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.events_layout,parent,false);
return new SearchViewHolder(view);
case 1:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.news_layout,parent,false);
return new SearchViewHolder(view);
case 2:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.last_world_memes_list_item,parent,false);
return new SearchViewHolder(view);
case 3:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.last_url_view,parent,false);
return new SearchViewHolder(view);
case 5:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.twitch,parent,false);
return new SearchViewHolder(view);
}
return new SearchViewHolder(view);
}
,此处我的绑定视图
@Override
public void onBindViewHolder(SearchViewHolder holder, final int position) {
switch (holder.getItemViewType()){
case 0:
Events event = models.getEvents().get(position);
do works
return;
case 1:
final LastWorldMemes mNews = models.getNews().get(position-(models.getEvents().size()));
do works
return;
case 2:
LastWorldMemes memes = models.getMemes().get(position-(models.getEvents().size()+models.getNews().size()));
do works
return;
case 3:
do works
return;
case 4:
}
}
问题是在recyclerview上获取itemCount这是我的代码,这是错误
int size =( models.getEvents().size()+models.getNews().size()+models.getTwitch().size()
+models.getExSites().size()+models.getMemes().size());
@Override
public int getItemCount() {
return size;
}
这是错误
02-19 18:27:38.216 14902-14902/app.mma.introsliderproject E/UncaughtException: java.lang.IndexOutOfBoundsException: Index: 8, Size: 8
at java.util.ArrayList.get(ArrayList.java:411)
at app.mma.PokerInfo.search.SearchAdapter.onBindViewHolder(SearchAdapter.java:109)
at app.mma.PokerInfo.search.SearchAdapter.onBindViewHolder(SearchAdapter.java:35)
答案 0 :(得分:1)
问题在于:您没有数组作为数据,但在概念上是一个矩阵。那么会发生什么,总计数是所有阵列中所有子节点的总和。例如,你有3个事件和2个新闻,当适配器达到4个位置它告诉你在onBind位置3,所以你去新闻阵列里面有3个位置的新闻,但你只有2个新闻。
<强>解决方案强>
imho,你应该将所有项目(新闻,事件等)放在一个数组中(例如,如果数组是通用的ArrayList&lt; T&gt;),例如在适配器构造函数中,或者创建一个更新适配器的方法。我希望如果没有发表评论就会很谨慎
修改强>
要了解您从数组中获得的项目类型,您可以使用
if(array.get(position) instanceof NewsItem{
// here we have a news item
}
答案 1 :(得分:0)
我认为getItemViewType
尝试简化:
final int eventsPositions = models.getEvents().size();
final int newsPositions = eventsPositions + models.getNews().size();
final int memesPositions = newsPositions + models.getMemes().size();
final int exSitesPositions = memesPositions + models.getExSites().size();
if (position < eventsSize) {
code = 0;
} else if (position < newsPositions) {
code = 1;
} else if (position < memesPositions) {
code = 2;
} else if (position < exSitesPositions) {
code = 3;
} else {
code = 4;
}