Фильтрация спиннеров для Android - PullRequest
0 голосов
/ 26 сентября 2019

Я работаю над приложением ecommerce, которое должно отображать варианты продуктов. Хороший пример, который я могу привести, - это phone в данном случае, iPhone 7. Там может быть iphone 7 с16 ГБ, 32 ГБ, 128 ГБ встроенной памяти, 1 ГБ или 2 ГБ оперативной памяти, пробел серого цвета и т. Д. Мне нужно отобразить эту информацию в spinners, и когда пользователь выбирает параметр e.g пробел серого цвета, он должен фильтровать все остальные счетчики с параметрамидоступно для этого выбора, в нашем случае это означает удаление опции 128 ГБ, если в iphone 7 не выделено пространство серого цвета с объемом памяти 128 ГБ.

Мои данные выглядят так

{

"variants": [
  {
    ....
   "attributes":{"COLOR":"RED","RAM":"8GB","Storage":"256GB"}
  },{
   ....
   "attributes":{"COLOR":"WHITE","RAM":"8GB","Storage":"32B"}
  },{
  ....
   "attributes":{"COLOR":"BLACK", "RAM":"6GB","Storage":"128GB"}
   }
 ]

}

Моя попытка былачтобы сначала заполнить эти данные счетчиками, для этого

  //I had to create a list of all attributes 
  allAttributesImmutableList = FluentIterable.from(product.getVariants())
            .transformAndConcat(new Function<Variant, List<Attribute>>() {
                @NullableDecl
                @Override
                public List<Attribute> apply(@NullableDecl Variant variant) {
                    List<Attribute> allAttributes = new ArrayList<>();
                    for (String key : variant.getAttributes().keySet()) {
                        allAttributes.add(new Attribute(key, variant.getAttributes().get(key)));
                    }
                    return allAttributes;
                }
            }).toList();


    //A list of Distinct keys to use as prompt for the spinners and keys
    distinctAttributeKeys = ImmutableSet.copyOf(FluentIterable.from(allAttributesImmutableList)
            .transform(Attribute::getAttr)
            .toList());



    return  Lists.newArrayList(ImmutableSet.copyOf(FluentIterable.from(distinctAttributeKeys)
            .transform(new Function<String, VariantGroup>() {
                @NullableDecl
                @Override
                public VariantGroup apply(@NullableDecl String title) {
                   return VariantGroup.VariantGroupBuilder
                   .aVariantGroup()
                   .withTitle(title)
                   .withSpinnerAdapter(new ArrayAdapter<>(getContext(), R.layout.spinner_item,  Lists.newArrayList(ImmutableSet.copyOf(FluentIterable.from(allAttributesImmutableList)
                           .transform(new Function<Attribute, String>() {
                               @NullableDecl
                               @Override
                               public String apply(@NullableDecl Attribute input) {
                                   if(title.equals(input.getAttr()))
                                       return input.getValue();
                                   return null;
                               }
                           }).filter(Predicates.notNull())
                           .toList()))))
                           .build();

                }
            }).toList()));

VariantGroup is just the title / key`` и всех доступных опций для этого ключа как SpinnerAdapter

public class VariantGroup {

private String title;
private SpinnerAdapter spinnerAdapter;

}

Это производит именно то, что я хочу, в итоге я получаю enter image description here

Но теперь мне нужно запустить filter spinners, когдапользователь выбирает e.g хранилище 256GB мне нужно отфильтровать все спиныПоказывать только опции для 25GB

Кто-нибудь, кто сделал что-то подобное?

...