ViewPager слишком медленный, пока идет - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь сделать свой собственный слайдер на Android с Java.Перед тем, как задавать этот вопрос, я много занимался исследованиями, но не смог найти никакого решения.

Мой ViewPager работает слишком медленно при использовании API 21, но отлично работает на API 23 или выше.

это, но мне не удалось:

  1. Я попытался viewPager.setOffscreenPageLimit (0);
  2. Я попытался изменить размеры изображений.
  3. Я пытался использовать Glide, но позже вернулся к setImageResource .
    • 3.1 Я попытался DiskCacheStrategy.ALL
  4. Я попытался использовать RecyclerView вместо ViewPager, но та же прокрутка застряла.
    • 4.1 Я пытался recyclerView.setHasFixedFixedSize (true);
    • 4.2 Я не делал никаких процессов в onBindViewHolder
  5. Даже я не помещал ни одного изображения в ImageView, все еще продолжал работать.Вы можете увидеть мой код ниже.

Активность:

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.activity_timeline);

        //Slider Process
        ViewPager slider = findViewById(R.id.vpSlider);
        ViewPagerIndicator pagerIndicator = findViewById(R.id.vpiTimeline);
        SliderAdapter sliderAdapter = new SliderAdapter(slider.getContext(),listSliderUrl());
        slider.setAdapter(sliderAdapter);
        slider.setOffscreenPageLimit(10);
        pagerIndicator.setupWithViewPager(slider);

Адаптер ViewPager:

public class SliderAdapter extends PagerAdapter {

private Context context;
private List<Integer> urls;
private LayoutInflater inflater;

public SliderAdapter(Context context, List<Integer> urls) {
    this.context = context;
    this.urls = urls;
}

@Override
public int getCount() {
    return urls.size();
}

@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
    return (View)object == view;
}

@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
    container.removeView((View) object);
}

@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
    inflater = 

(LayoutInflater)context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
//        View view = LayoutInflater.from(context).inflate(R.layout.item_slider,container,false);
        View view = inflater.inflate(R.layout.item_slider,container,false);
        ImageView iv = view.findViewById(R.id.ivSlider);
//        GlideApp.with(context).load(urls.get(position)).diskCacheStrategy(DiskCacheStrategy.ALL).into(iv);
        iv.setImageResource(urls.get(position));
        container.addView(view);
        return view;
    }
}

Адаптер View Recycler:

public class RecyclerViewSliderAdapter extends RecyclerView.Adapter {</p>

<pre><code>Context context;
List<Integer> urls;

public RecyclerViewSliderAdapter(Context context, List<Integer> urls) {
    this.context = context;
    this.urls = urls;
}

@NonNull
@Override
public ViewHolderSlider onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_slider,parent,false);
    ViewHolderSlider viewHolderSlider = new ViewHolderSlider(layoutView);
    return viewHolderSlider;
}

@Override
public void onBindViewHolder(@NonNull ViewHolderSlider holder, int position) {
    holder.bindData(urls.get(position));
}

@Override
public int getItemCount() {
    return urls.size();
}
</code>

}

class ViewHolderSlider extends RecyclerView.ViewHolder{</p>

<code>ImageView ivSlider;
public ViewHolderSlider(View itemView) {
    super(itemView);
    ivSlider = (ImageView)itemView.findViewById(R.id.ivSlider);
}
public void bindData(final Integer url){
    ivSlider.setImageResource(url);
}}
</code>

// Вот мой item_slider.xml

<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"> <ImageView android:id="@+id/ivSlider" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" android:scaleType="centerCrop" app:layout_constraintBottom_toBottomOf="parent" android:layout_margin="0dp"/> <ImageView android:id="@+id/ivGradient" android:layout_width="match_parent" android:layout_height="111dp" android:layout_margin="0dp" android:src="@mipmap/gradient" android:scaleType="fitXY" app:layout_constraintBottom_toBottomOf="@id/ivSlider" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> <TextView android:id="@+id/tvSliderHeader" android:layout_width="match_parent" android:fontFamily="@font/opensans_light" android:textSize="11sp" android:textColor="@color/yellow" android:layout_height="wrap_content" app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toTopOf="@id/tvSliderTitle" android:layout_marginBottom="7dp" android:layout_marginStart="32dp" android:text="@string/dunya" /> <TextView android:id="@+id/tvSliderTitle" android:textSize="24sp" android:layout_width="match_parent" android:layout_height="wrap_content" app:layout_constraintStart_toStartOf="parent" app:layout_constraintBottom_toBottomOf="@id/ivSlider" android:layout_marginBottom="26dp" android:layout_marginStart="31dp" android:textColor="@color/white" android:textStyle="bold" android:text="TÜRKİYE'YE KARŞI\nHİSLERİM DEĞİŞTİ" /> </android.support.constraint.ConstraintLayout>

1 Ответ

0 голосов
/ 23 ноября 2018

Это фактически утечка памяти, я использовал ViewPager внутри ConstraintLayout, я изменил ConstraintLayout на LinearLayout, и проблема решена!Если у вас возникла такая проблема, попробуйте изменить внешний макет.

...