gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:04:13 25 4
gpt4 key购买 nike

我目前正在使用适配器返回 2 个列表中的项目集,这样:

private List<ListResponse.Repo> mListResponseList;
private List<MyEvents.Event> mMyEventsList;

现在,MyListResponse.Repo 和 MyEvents.Event,为第一个 (ListResponse.Repo) 获取带有完整事件列表的 json 对象,为第二个 (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 设置为可见,否则设置如果标题不匹配,可见性就会消失。这是我目前正在使用的硬编码代码,只是想通过引入某种适用于我的情况的循环来使其更具动态性(到目前为止没有任何运气)。

    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 中是否有任何项目等于您的项目,如果它们相等,则将 cardview 设置为可见,否则它会按照 onBind 的定义保持 Gone。

修改:

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;
}
}

关于java - 如何在适配器 onBind() 中比较 2 个具有不同元素集的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57237144/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com