如何在适配器 onBind() 中比较 2 个具有不同元素集的列表?
How do I compare 2 lists with different set of elements , in an adapter onBind()?
我目前正在使用适配器 return 2 个列表中的项目集,这样:
private List<ListResponse.Repo> mListResponseList;
private List<MyEvents.Event> mMyEventsList;
现在,MyListResponse.Repo 和 MyEvents.Event 给我 json objects 完整的第一个事件列表 (ListResponse.Repo) 和一些 select 第二个事件很少 ( MyEvents.Event)
在我获取适配器的项目数中,我 return ListResponse.Repo 大小如下:
@Override
public int getItemCount() {
if (mListResponseList != null && mListResponseList.size() > 0 ) {
return mListResponseList.size();
} else {
return 1;
}
}
请注意:mListResponseList.size() 是所有事件的列表,所以它通常是 return 列表中的所有事件(比如说 6),如果我要使用 mMyEventsList.size ,它总是小于或等于 mListResponseList 中的项目列表,因为它实际上是从那里派生的(因为这些是我在另一个端点检索的主列表中的特定事件)。
现在,我遇到了一个问题,我试图仅显示 mMyEventsList 中的事件标题与从 mListResponseList return编辑的事件标题相匹配的事件。唯一的问题是,由于所有事件 returned 列表的大小大于 mMyEventsList returned 列表的大小,所以当我尝试比较它们时,我通常会遇到索引越界异常。我尝试使用以下代码:
if (position < mMyEventsList.size()){
if(mMyEventsList.get(position).getEventTitle().equals(repo.getTitle())
{
cardView.setVisibility(View.VISIBLE);
}
}
但它没有 return 正确的结果,只显示一张卡片(而不是 3 张左右,基于匹配的标题)
以下硬编码字符串适用于给定的测试场景(其中第一个列表有 8 个项目,第二个列表有 4 个,),但它仍然是硬编码的(如果第二个列表 return 超过 4,这不会工作),我想介绍一些动态的东西(如果我将具有不同大小的列表与索引越界异常进行比较,也要确保应用程序不会崩溃),因为随着列表项的变化,内容也会发生变化。
知道如何使以下比较动态化,所以它 return 是预期的结果,它将列表 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:抱歉拖了这么久,只是想解释一下我基本需要的东西,这是一个动态比较循环,它输出具有匹配标题的项目的结果(即使列表基于不同的大小不同数量的元素)
@Angela Heely 你应该用新列表更新你的改编
您将列表 1 中的项目 1 与列表 2 中的项目 1 进行比较。如果第二个列表是第一个列表的派生词,并且它包含例如项目 1,4 和 6,则项目 2 与项目 2 等进行比较. 列表 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;
}
}
代码 ArrayList 结果 = new ArrayList<>(); // 循环 arrayList2 项 for (Person person2 : arrayList2) { // 循环 arrayList1 项 boolean found = false; for (Person person1 : arrayList1) { if (person2.id == person1.id) { found = true; } } if (!found) { results.add(person2.id); } }
我目前正在使用适配器 return 2 个列表中的项目集,这样:
private List<ListResponse.Repo> mListResponseList;
private List<MyEvents.Event> mMyEventsList;
现在,MyListResponse.Repo 和 MyEvents.Event 给我 json objects 完整的第一个事件列表 (ListResponse.Repo) 和一些 select 第二个事件很少 ( MyEvents.Event)
在我获取适配器的项目数中,我 return ListResponse.Repo 大小如下:
@Override
public int getItemCount() {
if (mListResponseList != null && mListResponseList.size() > 0 ) {
return mListResponseList.size();
} else {
return 1;
}
}
请注意:mListResponseList.size() 是所有事件的列表,所以它通常是 return 列表中的所有事件(比如说 6),如果我要使用 mMyEventsList.size ,它总是小于或等于 mListResponseList 中的项目列表,因为它实际上是从那里派生的(因为这些是我在另一个端点检索的主列表中的特定事件)。
现在,我遇到了一个问题,我试图仅显示 mMyEventsList 中的事件标题与从 mListResponseList return编辑的事件标题相匹配的事件。唯一的问题是,由于所有事件 returned 列表的大小大于 mMyEventsList returned 列表的大小,所以当我尝试比较它们时,我通常会遇到索引越界异常。我尝试使用以下代码:
if (position < mMyEventsList.size()){
if(mMyEventsList.get(position).getEventTitle().equals(repo.getTitle())
{
cardView.setVisibility(View.VISIBLE);
}
}
但它没有 return 正确的结果,只显示一张卡片(而不是 3 张左右,基于匹配的标题)
以下硬编码字符串适用于给定的测试场景(其中第一个列表有 8 个项目,第二个列表有 4 个,),但它仍然是硬编码的(如果第二个列表 return 超过 4,这不会工作),我想介绍一些动态的东西(如果我将具有不同大小的列表与索引越界异常进行比较,也要确保应用程序不会崩溃),因为随着列表项的变化,内容也会发生变化。
知道如何使以下比较动态化,所以它 return 是预期的结果,它将列表 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:抱歉拖了这么久,只是想解释一下我基本需要的东西,这是一个动态比较循环,它输出具有匹配标题的项目的结果(即使列表基于不同的大小不同数量的元素)
@Angela Heely 你应该用新列表更新你的改编
您将列表 1 中的项目 1 与列表 2 中的项目 1 进行比较。如果第二个列表是第一个列表的派生词,并且它包含例如项目 1,4 和 6,则项目 2 与项目 2 等进行比较. 列表 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;
}
}
代码 ArrayList 结果 = new ArrayList<>(); // 循环 arrayList2 项 for (Person person2 : arrayList2) { // 循环 arrayList1 项 boolean found = false; for (Person person1 : arrayList1) { if (person2.id == person1.id) { found = true; } } if (!found) { results.add(person2.id); } }