【问题标题】:ViewPager is Too Slow While is Swiping滑动时 ViewPager 太慢
【发布时间】:2018-11-19 09:46:06
【问题描述】:

我正在尝试使用 Java 在 Android 上制作自己的滑块。 在问这个问题之前,我做了很多研究,但我找不到任何解决方案。

我的 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;
    }
}

回收者视图适配器:

公共类 RecyclerViewSliderAdapter 扩展 RecyclerView.Adapter {

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();
}

}

类 ViewHolderSlider 扩展 RecyclerView.ViewHolder{

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

//这是我的 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>

【问题讨论】:

  • ViewHolderSlider 是否在单独的类文件中? Glide 有什么问题?也可以帮助查看item_slider的布局文件
  • @Murat Sahin,可能会对您有所帮助:尝试更改屏幕外的页数,即总页数减 1
  • @PPartisan 我两者都用过,现在它在同一个文件中的不同类。滑行也很慢,它不能加快加载速度。
  • @RishavSingla 不幸的是,伙计,没有工作。

标签: android android-recyclerview android-viewpager


【解决方案1】:

这实际上是内存泄漏,我在 ConstraintLayout 中使用 ViewPager,我将 ConstraintLayout 更改为 LinearLayout 并解决了问题!如果你有这样的麻烦,试着改变外部布局。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多