如何解决Android报错:不兼容的类型:SliderAdapter无法转换为Adapter
问题原因
- 核心类型不兼容:
ViewPager2要求传入的适配器必须是RecyclerView.Adapter或FragmentStateAdapter的子类,你当前自定义的SliderAdapter继承的是适配旧版ViewPager的PagerAdapter,类型不匹配触发报错。 - 额外代码问题:现有
SliderAdapter的instantiateItem方法错误返回了父类方法的结果,应该返回你自己inflate出来的View实例,就算用旧版ViewPager这段代码也会触发运行异常。
解决方案
二选一即可:
方案1:改用旧版ViewPager(改动最小)
- 将布局文件
activity_on_board.xml中的androidx.viewpager2.widget.ViewPager2控件替换为androidx.viewpager.widget.ViewPager - 修改
OnBoardActivity的变量声明:把ViewPager2 viewPager2;改为ViewPager viewPager;,对应findViewById也匹配修改类型 - 修复
SliderAdapter的instantiateItem返回值:将return super.instantiateItem(container, position);改为return view;
方案2:适配ViewPager2(推荐,性能更优)
重写SliderAdapter继承RecyclerView.Adapter即可,修改后代码如下:
import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; public class SliderAdapter extends RecyclerView.Adapter<SliderAdapter.SliderViewHolder> { Context context; int images[] = { R.drawable.interview, R.drawable.send, R.drawable.click, R.drawable.call }; int headings [] = { R.string.first_title, R.string.second_title, R.string.third_title, R.string.fourth_title }; int descriptions[] = { R.string.first_decs, R.string.second_decs, R.string.third_decs, R.string.fourth_decs }; public SliderAdapter(Context context) { this.context = context; } @NonNull @Override public SliderViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(context).inflate(R.layout.slides_layout, parent, false); return new SliderViewHolder(view); } @Override public void onBindViewHolder(@NonNull SliderViewHolder holder, int position) { holder.imageView.setImageResource(images[position]); holder.heading.setText(headings[position]); holder.desc.setText(descriptions[position]); } @Override public int getItemCount() { return headings.length; } public class SliderViewHolder extends RecyclerView.ViewHolder { ImageView imageView; TextView heading; TextView desc; public SliderViewHolder(@NonNull View itemView) { super(itemView); imageView = itemView.findViewById(R.id.slider_image); heading = itemView.findViewById(R.id.slider_heading); desc = itemView.findViewById(R.id.slider_decs); } } }
修改后OnBoardActivity代码无需改动,直接运行即可。
内容的提问来源于stack exchange,提问作者Sam Viz
相关产品推荐
相关产品推荐

