我目前正在使用适配器返回 2 个列表中的项目集,例如:
private List<ListResponse.Repo> mListResponseList;
private List<MyEvents.Event> mMyEventsList;
现在,MyListResponse.Repo 和 MyEvents.Event ,为我获取 json 对象,其中包含第一个事件的完整列表(ListResponse.Repo)和第二个事件(MyEvents.Event)的一些事件
在我的适配器的获取项计数中,我返回 ListResponse.Repo 大小,如下所示:
@Override
public int getItemCount() {
if (mListResponseList != null && mListResponseList.size() > 0 ) {
return mListResponseList.size();
} else {
return 1;
}
}
请注意:mListResponseList.size() 是所有事件的列表,因此它通常返回列表中的所有事件(例如 6),如果我使用 mMyEventsList.size ,它总是小于或等于 mListResponseList 中的项目列表,因为它实际上从那里派生(因为这些是我在另一个端点中检索的主列表中的特定事件)。
现在,我遇到了一个问题,即我尝试仅显示mMyEventsList中的事件标题与mListResponseList返回的事件标题匹配的事件。唯一的问题是,由于所有事件返回的列表大小大于 mMyEventsList 返回的列表大小,因此当我尝试比较它们时,我通常会得到索引越界异常。我尝试使用以下代码:
if (position < mMyEventsList.size()){
if(mMyEventsList.get(position).getEventTitle().equals(repo.getTitle())
{
cardView.setVisibility(View.VISIBLE);
}
}
但它没有返回正确的结果,只显示一张卡片(而不是 3 张左右,基于匹配的标题)
以下硬编码字符串适用于给定的测试场景(第一个列表有 8 个项目,第二个列表有 4 个项目),但它仍然是硬编码的(如果第二个列表返回超过 4 个,这将不起作用),我想引入一些动态的东西(也通过确保如果我比较不同大小的列表与索引越界例外,应用程序不会崩溃),因为随着列表项的更改,内容也会更改。
任何想法如何使以下比较动态化,因此它返回预期结果,其中它将列表 1 中的项目与列表 2 中的项目进行比较,并将该特定元素的卡片视图设置为可见(如果标题匹配),否则如果标题不匹配,它将可见性设置为消失。 这是我目前使用的硬编码代码, 只是想通过引入某种适用于我的情况的循环来使其更具动态性(到目前为止没有任何运气)。
public void onBind(int position) {
super.onBind(position);
if(mMyEventsList.get(0).getEventTitle().equals(repo.getTitle()) && mMyEventsList.get(0).getIsAttending() ||
mMyEventsList.get(1).getEventTitle().equals(repo.getTitle()) && mMyEventsList.get(1).getIsAttending() ||
mMyEventsList.get(2).getEventTitle().equals(repo.getTitle()) && mMyEventsList.get(2).getIsAttending() ||
mMyEventsList.get(3).getEventTitle().equals(repo.getTitle()) && mMyEventsList.get(3).getIsAttending()){
cardView.setVisibility(View.VISIBLE);
} else {
cardView.setVisibility(View.GONE);
}
}
提前感谢! (p.s:很抱歉这么长,只是想解释一下我基本上需要什么,这是一个动态比较循环,它输出具有匹配标题的项目的结果(即使列表的大小基于不同的元素数量)
将列表 1 中的项目 1 与列表 2 中的项目 1 进行比较。项目 2 和项目 2,依此类推,如果第二个列表是第一个列表的派生,并且包含例如项目 1、4 和 6。列表 2 中的第 1 项是列表 1 中的第 1 项,但第 2 项是第 4 项,它们将不再匹配。您需要将列表 2 的每个项目与列表 1 的每个项目进行比较。例如
public void onBind(int position) {
super.onBind(position);
cardView.setVisibility(View.GONE);
for (int i = 0;i<mListResponseList;i++){
if (//Item from List 2 at Position 'Position' equals item on Position i of originallist){
cardView.setVisibility(View.VISIBLE);
break;
}
您基本上遍历整个列表 1 并检查是否有任何项目等于列表 2 中的项目,如果它们相等,则设置卡片视图可见,否则它会按照 Bind 上的定义保持消失。
修改:
cardView.setVisibility(View.GONE);
for (int i = 0;i<mMyEventsList.size();i++){
if (mMyEventsList.get(i).getEventTitle().equals(repo.getTitle()) ) {
cardView.setVisibility(View.VISIBLE);
break;
}
}
code ArrayList results =new ArrayList<>();//Loop arrayList2 items for (Person person2 : arrayList2) {//Loop arrayList1 items boolean find = false; for (Person person1 : arrayList1) { if (person2.id == person1.id) { found = true; } } if (!found) { results.add(person2.id); } }
@Angela Heely 你应该用新列表更新你的改编