【问题标题】:How to check if an item existing in one arraylist also exist in another arraylist?如何检查一个数组列表中存在的项目是否也存在于另一个数组列表中?
【发布时间】:2018-07-26 10:01:31
【问题描述】:

我正在开发一个应用程序,该应用程序在列表视图中提供附近的餐馆,用户还可以将它们存储在最喜欢的列表中。 启动应用程序时,会加载附近的地方。我想检查附近是否有任何附近的地方在收藏中,如果有,那么它应该标记它的复选框(用于将地方标记为收藏的复选框)。 它应该根据其名称检查附近的地点是否已经在收藏列表中可用,如果存在,则应选中其收藏复选框。 提前致谢! :) 这是我的适配器代码:

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

【问题讨论】:

    标签: java android arraylist android-arrayadapter android-adapter


    【解决方案1】:

    好吧,如果你真的想循环遍历ArrayList,你可以先得到你想要搜索的值。例如。 theNameYouWantToLookFor。然后循环遍历它:

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

    但是,您并不想在 UIThread 上执行此操作,并且由于您使用数据库存储这些值,我会立即从数据库中检索收藏夹,并将一些 boolean 添加到您的 @ 987654326@ 是否设置为Visible,取决于您数据库中的值。

    【讨论】:

    • 每当将地点添加到收藏夹时,我都会更改对象中的 int 值。我还从数据库中检索收藏夹列表。当我获取附近地点的列表时,对象的 isFavorite 值为 0。当我将其添加到收藏夹并保存在数据库中时,它会更改为 1。我希望列表应该从数据库中检查它是否包含任何地方,如果是,那么它应该将其标记为收藏。
    • 您可以像现在一样读取getView() 中的int 值。我在这里没有看到问题。
    • 当我从收藏夹中删除任何内容并显示所有地点时,它会将地点显示为我已删除的收藏夹。它不会在开始时更新从数据库中检索到的数组列表。
    • 我明白了。是的,那你可以用我的方法更新ArrayList
    • 我有一个问题,当我点击任何项目时..复选框正在消失,然后启动相应的活动。
    【解决方案2】:

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

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

    【讨论】:

    • 您能否发布一个链接或其他内容以了解更多信息,或者我可以在任何地方找到一个很好的示例来参考。我是android新手,所以不熟悉。
    • baeldung.com/apache-commons-collection-utils 这里可以找到sn-ps之类的。编辑:根据您使用的 api 级别和 java 版本,您将无法在集合上使用 forEach,但您仍然可以将交集存储为单独的变量并使用 for 循环或迭代器进行迭代。
    【解决方案3】:

    我建议您在数据库中创建另一个表来存储收藏夹。并将地点 ID 保存在其中。

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

    此 SQL 代码可能会对您有所帮助:

    "SELECT * FROM favorites WHERE id =" + id
    

    【讨论】:

    • 我想到了,但是每次调用数据库都会太多。每个对象每次都必须遍历整个数据库。
    • @YashMundra 我想不会有问题,因为您使用的是本地数据库。当您使用在线数据库时,对数据库的大量调用是一个问题。
    猜你喜欢
    • 2013-12-12
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2012-03-28
    相关资源
    最近更新 更多