Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何比较适配器onBind()中具有不同元素集的两个列表?_Java_Android_Android Recyclerview_Android Adapter_Android Cardview - Fatal编程技术网

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

Java 如何比较适配器onBind()中具有不同元素集的两个列表?,java,android,android-recyclerview,android-adapter,android-cardview,Java,Android,Android Recyclerview,Android Adapter,Android Cardview,我目前正在使用适配器返回2个列表中的项目集,例如: private List<ListResponse.Repo> mListResponseList; private List<MyEvents.Event> mMyEventsList; 请注意:mListResponseList.size()是所有事件的列表,因此它通常返回列表中的所有事件(例如6),如果我使用mMyEventsList.size,它总是小于或等于mListResponseList中的项目列表,因为

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

private List<ListResponse.Repo> mListResponseList;
private List<MyEvents.Event> mMyEventsList;
请注意:mListResponseList.size()是所有事件的列表,因此它通常返回列表中的所有事件(例如6),如果我使用mMyEventsList.size,它总是小于或等于mListResponseList中的项目列表,因为它实际上是从那里派生出来的(因为这些是我正在另一个端点中检索的主列表中的特定事件)

现在,我遇到了一个问题,即我试图仅显示mMyEventsList中的事件标题与从mListResponseList返回的事件标题相匹配的事件。唯一的问题是,由于所有事件返回的列表的大小都大于mMyEventsList返回的列表的大小,因此我通常在尝试t时会出现索引越界异常o比较它们。我尝试使用以下代码:

if (position < mMyEventsList.size()){

if(mMyEventsList.get(position).getEventTitle().equals(repo.getTitle())
     {
                    cardView.setVisibility(View.VISIBLE);

      }
}
提前谢谢!
(p.s:很抱歉这么长时间,我只是想解释一下我基本上需要什么,这是一个动态比较循环,它输出具有匹配标题的项目的结果(即使列表根据不同的元素数量具有不同的大小)

@Angela Heely如果第二个列表是第一个列表的派生项,并且包含例如项目1、4和6,那么您应该使用新列表更新您的适应项。

您可以比较列表1中的项目1和列表2中的项目1。项目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;
}
public void onBind(int位置){
super.onBind(位置);
设置可见性(View.GONE);

对于(int i=0;icode ArrayList results=new ArrayList();//对于(Person person2:arrayList2){//Loop arrayList1 items boolean found=false;对于(Person person1:arrayList1){if(person2.id==person1.id){found=true;}如果(!found){results.add(person2.id);}

检查派生列表中位置1的项目是否与原始列表中位置1的项目完全相同,但如果派生列表包含原始列表中的项目1、3和6,则仅适用于项目1。您需要检查派生列表中每个项目的整个原始列表。@DominikWuttke感谢您的回答。您能用代码明确你的场景。这样会更容易理解。我只是想让我的硬编码代码动态化,但不知道怎么做,有什么想法吗?正如你所说,
mMyEventsList
是从
mListResponseList
派生出来的,那么你为什么要进行比较。只需显示
mMyEventsList中的所有可用项即可@AngelaHeely@sagarsuri它是由列表1派生的,实际上没有我需要在cardview中显示的所有元素。假设列表1有图像和其他属性,而列表2只有标题和另一个不必要的属性,其中有两个独立的端点是在服务器上创建的,所以我无法在第二个端点上真正更改它们列表只有标题和另一个属性,我想显示第一个列表中的项目(其中有标题、图像和我需要的其他项目)仅当第二个列表和第一个列表中的标题匹配时才可以。如何操作?尝试比较这两个列表并生成一个筛选列表,您可以使用它更新适配器。code ArrayList results=new ArrayList();//循环arrayList2 items for(Person person2:arrayList2){//Loop arrayList1 items boolean found=false;for(Person person1:arrayList1){if(person2.id==person1.id){found=true;}}}if(!found){results.add(person2.id);}}}这应该作为注释添加,而不是作为答案添加。因此对于这一行:“如果(//列表2中位于‘Position’位置的项等于原始列表的位置i上的项){”会是吗“mMyEventList.get(i).getTitle().equals(repo.getTitle())”?此外,它是否会将列表1中的每一项与列表2中的每一项进行比较,而不发生崩溃?repo.getTitle()是什么?您的响应列表是否没有类似于“mMyEventList.get(i).getTitle()”的内容。您试图在代码示例中循环错误的列表我假设为“for”(int i=0;ii如果比较mMyEventList.get(位置)responselist和responselist中的每个项目都是7个项目,eventlist是4个项目。它将比较eventlist中的项目1和responselist中的项目1到7,以及eventlist中的项目2、3和4。您的eventlist只有4个项目,并且此函数将仅为这4个项目调用,这就是为什么您使用从onBind获得的位置。我理解nd您期望的逻辑是什么。我做了修改,并在您的答案中发布了从您的代码实际起作用的答案。感谢您的帮助,它实际上帮助您朝着正确的方向前进。+25因为您可以就我的代码进行解释。如果有一种直接的方法来做这件事,似乎上述方法可能是不必要的多余的
    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);
                }

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