猿问

如何在适配器 onBind() 中比较 2 个具有不同元素集的列表?

我目前正在使用适配器返回 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 中的项目进行比较,如果标题匹配,则将该特定元素的 cardview 设置为可见,否则将可见性设置为消失了,如果标题不匹配。这是我目前正在使用的硬编码代码,只是想通过引入某种适用于我的情况的循环来使其更具动态性(到目前为止没有任何运气)。


提前致谢!(ps:抱歉拖了这么久,只是想解释一下我基本需要的东西,这是一个动态比较循环,它输出具有匹配标题的项目的结果(即使列表基于不同数量的元素而具有不同的大小)


RISEBY
浏览 100回答 2
2回答

大话西游666

您将列表 1 中的项目 1 与列表 2 中的项目 1 进行比较。如果第二个列表是第一个列表的派生词,并且它包含例如项目 1,4 和 6,则项目 2 与项目 2 等进行比较。列表的项目 1 2 是列表 1 的第 1 项,但第 2 项是第 4 项,它们将永远不会再次匹配。您需要将列表 2 的每个项目与列表 1 的每个项目进行比较。例如public void onBind(int position) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 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 中的项目,如果它们相等,则将 cardview 设置为可见,否则它会按照 onBind 的定义保持 Gone。修改:cardView.setVisibility(View.GONE);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; for (int i = 0;i<mMyEventsList.size();i++){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (mMyEventsList.get(i).getEventTitle().equals(repo.getTitle()) ) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cardView.setVisibility(View.VISIBLE);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }

翻阅古今

代码 ArrayList 结果 = new ArrayList<>();&nbsp;// 循环 arrayList2 项 for (Person person2 : arrayList2) { // 循环 arrayList1 项 boolean found = false;&nbsp;for (Person person1 : arrayList1) { if (person2.id == person1.id) { found = true;&nbsp;} } if (!found) { results.add(person2.id);&nbsp;} }
随时随地看视频慕课网APP

相关分类

Java
我要回答