Android Studio: заполнение Spinner в обзоре переработчика, когда у нас есть целочисленное значение - PullRequest
0 голосов
/ 17 октября 2019

Я пытаюсь заполнить Spinner в обзоре переработчика из значения int (purchaseList.getAmount()), которое я получаю с сервера. Каждый объект имеет свое (int) значение.

Ниже приведен адаптер просмотра утилита. Как можно видеть, до сих пор я создал счетчик, используя фиксированный список строк (maxAmount), и понял, что когда я прокручиваю вниз обзор утилит, он становится немного запаздывающим.

public class CartFragAdapter extends RecyclerView.Adapter<CartFragAdapter.CartFragViewHolder> {

    private static final String TAG = "debinf CartFragAdap";

    private HashMap<Integer,Integer> selectedItem = new HashMap<Integer, Integer>();

    private final String[] maxAmount = new String[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
            "11", "12", "13", "14", "15", "16", "17", "18", "19", "20",
            "21", "22", "23", "24", "25", "26", "27", "28", "29", "30",
            "31", "32", "33", "34", "35", "36", "37", "38", "39", "40",
            "41", "42", "43", "44", "45", "46", "47", "48", "49", "50",
            "51", "52", "53", "54", "55", "56", "57", "58", "59", "60",
            "61", "62", "63", "64", "65", "66", "67", "68", "69", "70",
            "71", "72", "73", "74", "75", "76", "77", "78", "79", "80",
            "81", "82", "83", "84", "85", "86", "87", "88", "89", "90",
            "91", "92", "93", "94", "95", "96", "97", "98", "99", "100" };

    private Context context;

    public CartFragAdapter(Context context) {
        this.context = context;
    }

    private static final DiffUtil.ItemCallback<ProductsObject> DIFF_CALLBACK = new DiffUtil.ItemCallback<ProductsObject>() {
        @Override
        public boolean areItemsTheSame(@NonNull ProductsObject oldProduct, @NonNull ProductsObject newProduct) {
            return oldProduct.getCode().equals(newProduct.getCode());
        }

        @Override
        public boolean areContentsTheSame(@NonNull ProductsObject oldProduct, @NonNull ProductsObject newProduct) {
            return oldProduct.getPrice() == newProduct.getPrice();
        }
    };

    private AsyncListDiffer<ProductsObject> differ = new AsyncListDiffer<ProductsObject>(this, DIFF_CALLBACK);

    @NonNull
    @Override
    public CartFragViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_purchase, parent, false);
        return new CartFragViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull CartFragViewHolder holder, final int position) {
        final ProductsObject purchaseList = differ.getCurrentList().get(position);

        holder.mCode.setText(purchaseList.getCode());
        holder.mPrice.setText(String.valueOf(purchaseList.getPrice()));
        holder.mDescription.setText(purchaseList.getDescription());

        // Convert purchaseList.getAmount() (int) into String[] containing its sequence from 1 to purchaseList.getAmount()

        ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(context, R.layout.support_simple_spinner_dropdown_item, maxAmount);
        spinnerAdapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
        holder.mAmount.setAdapter(spinnerAdapter);

        if (selectedItem.get(position) != null) {
            holder.mAmount.setSelection(selectedItem.get(position));
        }

        holder.mAmount.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position_i, long id) {
                //Log.i(TAG, "onItemSelected: Spinner position is "+position_i+" ; value is "+parent.getItemAtPosition(position_i));

                if (selectedItem.get(position) != null) {
                    // Case 1: spinner modification
                    if (selectedItem.get(position) != position_i) {
                        int number = Integer.parseInt(parent.getItemAtPosition(position_i).toString());
                        selectedItem.put(position, position_i);
                        purchaseList.setAmount(number);
                        Log.i(TAG, "onItemSelected: NOT NULL AND POS != POS_I " + purchaseList.getAmount());
                    }

                } else if (selectedItem.get(position) == null) {
                    // Case 2: spinner is null or empty
                    int number = Integer.parseInt(parent.getItemAtPosition(position_i).toString());
                    selectedItem.put(position, position_i);
                    purchaseList.setAmount(number);
                    Log.i(TAG, "onItemSelected: SPINNER NULL OR EMPTY " + purchaseList.getAmount());

                }

            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {

            }
        });

    }

    @Override
    public int getItemCount() {
        return differ.getCurrentList().size();
    }

    public List<ProductsObject> getCurrentItemList() {
        return differ.getCurrentList();
    }

    public void submitList(List<ProductsObject> products){
        Log.i(TAG, "submitList: products.size is "+products.size());
        differ.submitList(products);
    }

    public class CartFragViewHolder extends RecyclerView.ViewHolder {

        public TextView mCode, mPrice, mDescription;
        public Spinner mAmount;

        public CartFragViewHolder(@NonNull View itemView) {
            super(itemView);

            mCode = (TextView) itemView.findViewById(R.id.item_productCode);
            mAmount = (Spinner) itemView.findViewById(R.id.item_productAmountSpinner);
            mPrice = (TextView) itemView.findViewById(R.id.item_productPrice);
            mDescription = (TextView) itemView.findViewById(R.id.item_productDescription);
        }
    }
}

Мои вопросы:

1) Как создать порядковый номер в String[] из моего объекта (int) purchaseList.getAmount()? например. 1 до purchaseList.getAmount() без создания цикла, поскольку добавление цикла для итерации до моего (int) value может еще больше снизить производительность приложения.

2) Что было бы хорошопопрактикуйтесь в том, чтобы заполнить счетчик в обзоре переработчика таким образом, чтобы повысить производительность (без задержки при прокрутке). - В настоящее время у меня наблюдается низкая производительность.

PS.: К сожалению, приведенная ниже команда доступна для API LEVEL 24+, и я использую API LEVEL 23.

int[] range = IntStream.range(1, purchaseList.getAmount()).toArray();
int[] range = IntStream.rangeClosed(1, purchaseList.getAmount()).boxed().collect(Collectors.toList())

Вот пример картинки:

enter image description here

1 Ответ

0 голосов
/ 17 октября 2019

Я нашел решение для Вопрос (1) без явной реализации циклов, которые я не знаю, является ли он лучшим или нет.

Я ценю, если кто-то ответит на мой Вопрос (2) и лучшее решение для Вопрос (1) .

Во-первых, я создал Function в адаптере утилита просмотра, как показано ниже:

private Function<Integer, String> myFunction = new Function<Integer, String>() {
    @javax.annotation.Nullable
    @Override
    public String apply(@javax.annotation.Nullable Integer input) {
        return String.valueOf(input);
    }
};

Во-вторых, я создал метод в адаптере утилита просмотра, как показано ниже:

private static <T, U> List<U> convertIntListToStringList(List<T> listOfInteger, Function<T, U> function) {
    // https://stackoverflow.com/questions/10242380/how-can-i-generate-a-list-or-array-of-sequential-integers-in-java
    // https://www.geeksforgeeks.org/program-to-convert-list-of-integer-to-list-of-string-in-java/
    // Guava’s List.transform():
    return Lists.transform(listOfInteger, function);
}

И, наконец, мне удалось создать Integer range и егопреобразование в List<String> внутри onBindViewHolder, как показано ниже:

// Convert purchaseList.getAmount() (int) into String[] containing its sequence from 1 to purchaseList.getAmount()
int[] range = Ints.toArray(ContiguousSet.create(Range.closed(1, purchaseList.getAmount()), DiscreteDomain.integers()));
List<Integer> rangeList = Ints.asList(range);
List<String> listOfString = convertIntListToStringList(rangeList, myFunction);

ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<>(context, R.layout.support_simple_spinner_dropdown_item, listOfString);
spinnerAdapter.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
holder.mAmount.setAdapter(spinnerAdapter);
...