Используйте regex для удаления форматирования (доллар и запятую) и используйте parseFloat для преобразования строки в число с плавающей запятой. `
var currency = "$1,100.00";
currency.replace(/[$,]+/g,"");
var result = parseFloat(currency) + .05;
Вы получите эту ошибку на некоторых Samsung, Sony, ... Внедрение ICS. Оба, которые я основал, включают в себя странные внутренние представления управления. Одним из решений этого является расширение RecyclerView (или класса, который генерирует проблему) с вашим собственным классом и использование этого. В этом классе вы будете «съедать» все возможные исключения для этих устройств. Это уродливо, это ужасно, но это все, что я могу сделать, чтобы решить такие проблемы.
Для вашей конкретной проблемы с scrollTo ....
package com.stackoverflow.customviews;
public class CustomRecyclerView extends RecyclerView{
private static final String TAG = "CustomRecyclerView";
public CustomRecyclerView(android.content.Context context) {
super(context);
}
public CustomRecyclerView(android.content.Context context, android.util.AttributeSet attrs) {
super(context, attrs);
}
public CustomRecyclerView(android.content.Context context, android.util.AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public void scrollTo(int x, int y) {
Log.e(TAG, "CustomRecyclerView does not support scrolling to an absolute position.");
// Either don't call super here or call just for some phones, or try catch it. From default implementation we have removed the Runtime Exception trown
}
}
Затем вы можете заменить в своем макете XML этот новый класс:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.stackoverflow.customviews.CustomRecyclerView
android:id="@+id/my_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:overScrollMode="never"
android:scrollbars="vertical" />
</FrameLayout>
Для программной прокрутки необходимо использовать LayoutManager. Например, LinearLayoutManager имеет scrollToPositionWithOffset. GridLayoutManager расширяет LinearLayoutManager - так что вы также можете использовать это. У меня работает код:
RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
if (layoutManager instanceof LinearLayoutManager) {
LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager;
linearLayoutManager.scrollToPositionWithOffset(0, newTopMargin - defaultMargin);
}
У меня возникла та же проблема с предупреждением из-за следующего в родительском объекте утилизатора:
android:animateLayoutChanges="true"
Если вы хотите сохранить анимацию, просто поместите утилизатор в другого родителя, как framelayout
. У меня это работало нормально, и анимация тоже играет хорошо.
Как другие сказали в их ответах android:animateLayoutChanges="true"
в RecyclerView
родительская причина расположения эта проблема, но решение легче, чем другие сказали.
Просто необходимо поместить Ваш RecyclerView
в новое Layout
, который не имеет android:animateLayoutChanges
свойство.
, Например:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:animateLayoutChanges="true">
...
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
app:layout_constraintTop_toTopOf="parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>