Я пытаюсь заполнить 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())
Вот пример картинки: