Java 如何检查一个arraylist中存在的项是否也存在于另一个arraylist中?

Java 如何检查一个arraylist中存在的项是否也存在于另一个arraylist中?,java,android,arraylist,android-arrayadapter,android-adapter,Java,Android,Arraylist,Android Arrayadapter,Android Adapter,我正在开发一个应用程序,它可以在列表视图中显示附近的餐馆,用户还可以将它们存储在收藏夹列表中。 当应用程序启动时,将加载附近的位置。我想检查“收藏夹”中是否有任何邻近位置,如果有,则应标记其复选框(用于将位置标记为“收藏夹”的复选框)。 它应该根据其名称检查邻近位置是否已在收藏夹列表中可用,如果存在,则应选中其收藏夹复选框。 提前感谢!:) 以下是我的适配器代码: public class RestaurantAdapter extends ArrayAdapter<PlaceDetail

我正在开发一个应用程序,它可以在列表视图中显示附近的餐馆,用户还可以将它们存储在收藏夹列表中。 当应用程序启动时,将加载附近的位置。我想检查“收藏夹”中是否有任何邻近位置,如果有,则应标记其复选框(用于将位置标记为“收藏夹”的复选框)。 它应该根据其名称检查邻近位置是否已在收藏夹列表中可用,如果存在,则应选中其收藏夹复选框。 提前感谢!:) 以下是我的适配器代码:

public class RestaurantAdapter extends ArrayAdapter<PlaceDetailsClass>
{
Context context;
ArrayList<PlaceDetailsClass> placeDetailsClassArrayList;
ArrayList<PlaceDetailsClass> favouriteList;
private DatabaseHelper db;
public RestaurantAdapter(Context context, ArrayList<PlaceDetailsClass> placeDetailsClassArrayList)
{
    super(context, R.layout.restaurant_list_item, placeDetailsClassArrayList);
    this.context=context;
    this.placeDetailsClassArrayList = placeDetailsClassArrayList;
    db=new DatabaseHelper(context);
    Log.w("ArrayList in resAdapter",placeDetailsClassArrayList.toString());
    this.favouriteList = new ArrayList<>(db.getAllPlaces("restaurant"));
}
public static class Holder
{
    TextView nameTv;
    TextView vicinityTv;
    CheckBox favourite;
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    final PlaceDetailsClass data = getItem(position);
    final Holder viewHolder;
    if (convertView == null)
    {
        viewHolder = new Holder();
        LayoutInflater inflater = LayoutInflater.from(getContext());
        convertView = inflater.inflate(R.layout.restaurant_list_item, parent, false);
        viewHolder.nameTv = (TextView) convertView.findViewById(R.id.tv_restaurantname);
        viewHolder.vicinityTv = (TextView) convertView.findViewById(R.id.tv_restaurantvicinity);
        viewHolder.favourite = (CheckBox) convertView.findViewById(R.id.chkbx_favourite);
        convertView.setTag(viewHolder);

    }
    else
    {
        viewHolder = (Holder) convertView.getTag();
    }

    viewHolder.favourite.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            if(viewHolder.favourite.isChecked())
            {
                db.addToFavourites(context.getString(R.string.restaurant), data.getName(),data.getVicinity(),data.getRating(),data.getLatitude(),data.getLongitude(),1);
                Toast.makeText(context,data.getName()+" "+context.getString(R.string.addToFav), Toast.LENGTH_SHORT).show();
            }
            else
            {
                db.removePlace(data.getName());
                Toast.makeText(context, data.getName()+" "+context.getString(R.string.removeFromFav), Toast.LENGTH_SHORT).show();
            }
        }
    });
    viewHolder.nameTv.setText(data.getName());
    viewHolder.vicinityTv.setText(data.getVicinity());
    if(data.getFavourite()==1)
    {
        viewHolder.favourite.setChecked(true);
    }
    else
    {
        viewHolder.favourite.setChecked(false);
    }
    return convertView;
}

@Override
public int getViewTypeCount()
{
    return getCount();
}

@Override
public int getItemViewType(int position)
{
    return position;
}

@Override
public int getCount()
{
    return placeDetailsClassArrayList.size();
}

@Override
public long getItemId(int position)
{
    return position;
}
}
公共类RestaurantAdapter扩展了ArrayAdapter
{
语境;
ArrayList PlaceDetailsAssarrayList;
ArrayList收藏夹列表;
专用数据库;
公共餐厅适配器(上下文,ArrayList PlaceDetailsAssarrayList)
{
super(上下文、右布局、餐厅列表、位置详细信息列表);
this.context=context;
this.placeDetailsClassArrayList=placeDetailsClassArrayList;
db=新数据库助手(上下文);
Log.w(“重新适应程序中的ArrayList”,placeDetailsClassArrayList.toString());
this.favoriteList=新的ArrayList(db.getAllPlaces(“餐厅”);
}
公共静态类持有者
{
文本视图名称电视;
TextView-vicinityTv;
复选框收藏夹;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图)
{
最终位置DetailsClass数据=获取项目(位置);
最终持票人;
if(convertView==null)
{
viewHolder=新支架();
LayoutInflater充气器=LayoutInflater.from(getContext());
convertView=充气机。充气(R.layout.restaurant\u list\u项,父项,false);
viewHolder.nameTv=(TextView)convertView.findViewById(R.id.tv\u restaurantname);
viewHolder.vicinityTv=(TextView)convertView.findViewById(R.id.tv\u restaurantvicity);
viewHolder.favorite=(复选框)convertView.findViewById(R.id.chkbx_favorite);
convertView.setTag(viewHolder);
}
其他的
{
viewHolder=(Holder)convertView.getTag();
}
viewHolder.favorite.setOnClickListener(新视图.OnClickListener()
{
@凌驾
公共void onClick(视图v)
{
if(viewHolder.favorite.isChecked())
{
db.addToFavourites(context.getString(R.string.restaurant)、data.getName()、data.getappearance()、data.getRating()、data.getLatitude()、data.getLatitude()、1);
Toast.makeText(context,data.getName()+“”+context.getString(R.string.addToFav),Toast.LENGTH_SHORT.show();
}
其他的
{
db.removePlace(data.getName());
Toast.makeText(context,data.getName()+“”+context.getString(R.string.removeFromFav),Toast.LENGTH\u SHORT.show();
}
}
});
viewHolder.nameTv.setText(data.getName());
viewHolder.vicinityTv.setText(data.getappearchy());
if(data.getFavorite()==1)
{
viewHolder.favorite.setChecked(true);
}
其他的
{
viewHolder.favorite.setChecked(false);
}
返回视图;
}
@凌驾
public int getViewTypeCount()
{
返回getCount();
}
@凌驾
public int getItemViewType(int位置)
{
返回位置;
}
@凌驾
public int getCount()
{
返回placeDetailsClassArrayList.size();
}
@凌驾
公共长getItemId(int位置)
{
返回位置;
}
}

我建议您在数据库中创建另一个表来存储收藏夹。并在其中保存位置id

然后在数据库助手中编写一个方法,检查该id是否存在于收藏夹表中

此SQL代码可能会帮助您:

"SELECT * FROM favorites WHERE id =" + id

也许您可以使用apache collectionUtils并执行以下操作:

CollectionUtils.intersection(favoriteList, placeDetailsClassArrayList).forEach(place -> place.setIsFavourite(true));

如果你真的想循环遍历
ArrayList
,你可以先得到你想要搜索的值。例如,
您要查找的名称
。然后只需在其中循环:

for(PlaceDetailsClass favourite : favouriteList) {
  if(favourite.getName().equals(theNameYouWantToLookFor)) {
    // Found, check the checkbox
  }
}

但是,您并不想在
UIThread
上执行此操作,因为您正在使用数据库来获取这些值,我会立即从数据库中检索收藏夹,并将一些
布尔值
添加到
视图
中,以使其可见或不可见,基于数据库中的值。

我考虑过,但每次都会对数据库进行太多调用。对于每个对象,每次都必须遍历整个数据库。@YashMundra我想这不会有问题,因为您使用的是本地数据库。当您使用在线数据库时,对数据库的大量调用是一个问题。您是否可以发布一个链接或其他内容来了解更多关于它的信息,或者我是否可以在任何地方找到一个好的示例来参考。我是android新手,所以我不熟悉它。在这里你可以找到一些片段等等。编辑:根据您使用的api级别和java版本,您将无法在集合上使用forEach,但您仍然可以将交集存储为单独的变量,并使用for循环或迭代器进行迭代。每当将位置添加到收藏夹时,我都会更改对象中的int值。我还从数据库中检索收藏夹列表。当我获取附近位置的列表时,对象的isFavorite值为0。当我将它添加到收藏夹并保存在数据库中时,它被更改为1。我希望列表应该从数据库中检查是否包含任何位置,如果是,则应该将其标记为收藏夹。您可以像现在一样,在
getView()
中读取
int
值。我看不出这里有什么问题。当我从收藏夹中删除任何内容并要显示所有位置时,它会将已删除的位置显示为收藏夹。它没有在开始时更新从数据库检索到的数组列表。我理解。是的,然后您可以使用我的方法更新
ArrayList
。当我单击任何项目时,我遇到了问题。复选框正在消失