Как улучшить производительность ScrollView? - PullRequest
1 голос
/ 02 апреля 2020

У меня есть scrollView, который работает очень медленно. Внутри этого ScrollView у меня есть фрагменты с пользовательским интерфейсом. Я добавляю фрагменты с помощью FragmentTransactions. Как я могу улучшить производительность ScrollView. Я считаю, что использование фрагментов внутри ScrollView не лучший выбор? Что вы думаете.

Вот мой ScrollView в main_activity. xml

    <ScrollView
    android:id="@+id/scrollView"
    style="@style/scrollbar_shape_style"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingStart="15dp"
    android:paddingTop="145dp"
    android:scrollbarSize="10dip"
    android:scrollbarTrackVertical="@android:color/white"
    android:paddingEnd="25dp"
    app:layout_constraintTop_toBottomOf="@id/amount"
    tools:layout_editor_absoluteX="202dp">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="20dp"
        app:layout_constraintTop_toBottomOf="@id/amount">

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/first_business"
            android:name="stoppandemic.emptymindgames.com.HospitalFragment"
            android:layout_width="match_parent"
            android:layout_height="283dp" />

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/second_business"
            android:name="stoppandemic.emptymindgames.com.HospitalFragment"
            android:layout_width="match_parent"
            android:layout_height="283dp"
            android:layout_marginTop="120dp" />


        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/third_business"
            android:name="stoppandemic.emptymindgames.com.HospitalFragment"
            android:layout_width="match_parent"
            android:layout_height="283dp"
            android:layout_marginTop="240dp" />

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/fourth_business"
            android:name="stoppandemic.emptymindgames.com.HospitalFragment"
            android:layout_width="match_parent"
            android:layout_height="283dp"
            android:layout_marginTop="360dp" />

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/fifth_business"
            android:name="stoppandemic.emptymindgames.com.HospitalFragment"
            android:layout_width="match_parent"
            android:layout_height="283dp"
            android:layout_marginTop="480dp" />

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/sixth_business"
            android:name="stoppandemic.emptymindgames.com.HospitalFragment"
            android:layout_width="match_parent"
            android:layout_height="283dp"
            android:layout_marginTop="600dp" />

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/seventh_business"
            android:name="stoppandemic.emptymindgames.com.HospitalFragment"
            android:layout_width="match_parent"
            android:layout_height="283dp"
            android:layout_marginTop="720dp" />

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/eighth_business"
            android:name="stoppandemic.emptymindgames.com.HospitalFragment"
            android:layout_width="match_parent"
            android:layout_height="283dp"
            android:layout_marginTop="840dp" />

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/ninth_business"
            android:name="stoppandemic.emptymindgames.com.HospitalFragment"
            android:layout_width="match_parent"
            android:layout_height="283dp"
            android:layout_marginTop="960dp" />

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/tenth_business"
            android:name="stoppandemic.emptymindgames.com.HospitalFragment"
            android:layout_width="match_parent"
            android:layout_height="283dp"
            android:layout_marginTop="1080dp" />


    </FrameLayout>

</ScrollView>

Вот мой FragmentClass

public class HospitalFragment extends Fragment {


public onImageClickListener mCallBack;

public final static String TAG = "ArtemyDebugger";

private int mTime;
private int mAmountOfProduction;
private int mPrice;
private int mId;
private int mMultiplier;
private int MultiplierPeople;

private View view;
OneBusinesBinding binding;

public HospitalFragment() {
}

public void setmHospital(Hospital hospital) {
    this.mTime = hospital.getTime();
    this.mAmountOfProduction = hospital.getAmount();
    this.mPrice = hospital.getPrice();
    this.mId = hospital.getId();
    this.mMultiplier = hospital.getMultiplier();
    this.MultiplierPeople = hospital.getMultiplierPeople();
}

public interface onImageClickListener {
    void clickOnImage(int id);

    void onTextViewOfPriceSelected(int id, int amountOfProduction, int price, int time, int multiplier);
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);

    try {
        mCallBack = (onImageClickListener) context;
    } catch (ClassCastException e) {
        throw new ClassCastException(context.toString()
                + " must implement OnImageClickListener");
    }
}

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
}


@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    binding = DataBindingUtil.inflate(
            inflater, R.layout.one_busines, container, false);
    view = binding.getRoot();
    binding.imageBusiness.setImageResource(AndroidImageAssets.getPictures().get(mId));
    binding.amountofProduction.setText(getString(R.string.amount_of_production, mAmountOfProduction));
    binding.price.setText(getString(AssetsUpgradeStrings.getStrings_On_Button_Buy().get(mId), convertNumberToString(mPrice)));
    binding.progressBar.setProgressTintList(ColorStateList.valueOf(Color.GRAY));
    ;
    binding.nameHospital.setText(AssetsUpgradeStrings.getHospitalsNames().get(mId));
    binding.textViewOnProgressbar.setText(getString(R.string.string_on_progressbar, mTime));
    binding.imageBusiness.setOnClickListener((v) -> {

        mCallBack.clickOnImage(mId);
    });
    binding.price.setOnClickListener((v) -> {
        if (MainActivity.mAllMoney >= mPrice) {

            mAmountOfProduction++;
            MainActivity.mAllMoney -= mPrice;
            mPrice = (int) Math.ceil(MyConstants.getPrices().get(mId) * Math.pow(1.12, mAmountOfProduction));
            mCallBack.onTextViewOfPriceSelected(mId, mAmountOfProduction, mPrice, mTime, mMultiplier);
            binding.price.setText(getString(AssetsUpgradeStrings.getStrings_On_Button_Buy().get(mId), convertNumberToString(mPrice)));
            binding.amountofProduction.setText(getString(R.string.amount_of_production, mAmountOfProduction));
        }
    });
    return view;
}

Вот мой MainActivity

HospitalFragment firstHospitalFragment = new HospitalFragment();
    HospitalFragment secondHospitalFragment = new HospitalFragment();
    HospitalFragment thirdHospitalFragment = new HospitalFragment();
    HospitalFragment fourthHospitalFragment = new HospitalFragment();
    HospitalFragment fifthHospitalFragment = new HospitalFragment();
    HospitalFragment sixthHospitalFragment = new HospitalFragment();
    HospitalFragment seventhHospitalFragment = new HospitalFragment();
    HospitalFragment eighthHospitalFragment = new HospitalFragment();
    HospitalFragment ninthHospitalFragment = new HospitalFragment();
    HospitalFragment tenthHospitalFragment = new HospitalFragment();
     firstHospitalFragment.setmHospital(mListHospitals.get(0));
    secondHospitalFragment.setmHospital(mListHospitals.get(1));
    thirdHospitalFragment.setmHospital(mListHospitals.get(2));
    fourthHospitalFragment.setmHospital(mListHospitals.get(3));
    fifthHospitalFragment.setmHospital(mListHospitals.get(4));
    sixthHospitalFragment.setmHospital(mListHospitals.get(5));
    seventhHospitalFragment.setmHospital(mListHospitals.get(6));
    eighthHospitalFragment.setmHospital(mListHospitals.get(7));
    ninthHospitalFragment.setmHospital(mListHospitals.get(8));
    tenthHospitalFragment.setmHospital(mListHospitals.get(9));

    fragmentManager.beginTransaction()
            .replace(R.id.first_business, firstHospitalFragment)
            .replace(R.id.second_business, secondHospitalFragment)
            .replace(R.id.third_business, thirdHospitalFragment)
            .replace(R.id.fourth_business, fourthHospitalFragment)
            .replace(R.id.fifth_business, fifthHospitalFragment)
            .replace(R.id.sixth_business, sixthHospitalFragment)
            .replace(R.id.seventh_business, seventhHospitalFragment)
            .replace(R.id.eighth_business, eighthHospitalFragment)
            .replace(R.id.ninth_business, ninthHospitalFragment)
            .replace(R.id.tenth_business, tenthHospitalFragment)
            .commit();

1 Ответ

0 голосов
/ 03 апреля 2020

для первой части вашего вопроса (Как улучшить scrollView) проверьте следующую ссылку (документация AndroidDeveloper scrollView), где вы найдете всю информацию о том, как улучшить ваш scrollView, и сделайте его более плавным

https://developer.android.com/reference/android/widget/ScrollView

Что касается второй части вашего вопроса, нет, вложенный scrollView не является хорошей практикой, я предлагаю вам взглянуть на следующую ветку для получения дополнительной информации

https://www.reddit.com/r/androiddev/comments/298kyx/fragments_inside_a_scrollview/

Надеюсь, это поможет! Если нет, то извините, я не смог бы вам чем-то помочь, возможно, вы можете попробовать отредактировать свой вопрос, чтобы прояснить его. :)

...