如何检查一个数组列表中存在的项目是否也存在于另一个数组列表中?

时间:2018-07-26 10:01:31

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

我正在开发一个应用程序,该应用程序在列表视图中靠近餐厅,用户也可以将其存储在收藏夹列表中。 启动应用程序后,将加载by by附近的地方。我想检查收藏夹中是否有附近的地点,如果有,则应选中其复选框(用于将地点标记为收藏夹的复选框)。 它应根据其名称检查“最爱列表”中是否已存在某个附近的地方,如果存在,则应选中“最喜欢的”复选框。 提前致谢! :) 这是我的适配器代码:

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

好吧,如果您真的想遍历ArrayList,则可以先获取要搜索的值。例如。 theNameYouWantToLookFor。然后循环遍历:

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

但是,您实际上并不想在UIThread上执行此操作,并且由于您正在使用这些值的数据库,因此我会立即从数据库中检索收藏夹,并添加一些{{1} }到您的boolean能否根据数据库中的值设置为View

答案 2 :(得分:0)

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

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

此SQL代码可能会帮助您:

"SELECT * FROM favorites WHERE id =" + id