Kotlin转Java后RecyclerView无法调用ViewHolder的bind()方法怎么办?
如何在Java版RecyclerView Adapter中调用自定义ViewHolder的bind方法?
嗨,这个问题我之前在项目里也碰到过,其实本质是Kotlin和Java的类型处理逻辑不一样导致的。
问题根源
在你的Kotlin Adapter里,你可以直接把RecyclerView.ViewHolder强转为RepoViewHolder后调用bind()——这是因为Kotlin有智能类型转换,编译器会自动验证强转的安全性,然后允许你调用子类的方法。但Java是静态类型语言,编译器只知道holder是RecyclerView.ViewHolder类型,而这个父类并没有定义bind()方法,所以直接调用会报错。
解决方法
你只需要在Java代码里显式地把RecyclerView.ViewHolder强转为RepoViewHolder,就能调用bind()方法了。如果想更严谨,还可以先加个instanceof判断避免类型转换异常。
修正后的Java Adapter代码
public class ReposAdapterJava extends ListAdapter<Repo, RecyclerView.ViewHolder> { private static DiffUtil.ItemCallback<Repo> callback = new DiffUtil.ItemCallback<Repo>() { @Override public boolean areItemsTheSame(Repo oldItem, Repo newItem) { return oldItem.getFullName().equals(newItem.getFullName()); } @Override public boolean areContentsTheSame(Repo oldItem, Repo newItem) { return oldItem.equals(newItem); // 这里建议用equals而不是==,避免对象引用不同但内容相同的情况 } }; protected ReposAdapterJava() { super(callback); } @NonNull @Override public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { return RepoViewHolder.Companion.create(parent); } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) { Repo itemRepo = getItem(position); if(itemRepo != null){ // 显式强转为RepoViewHolder后调用bind方法 if (holder instanceof RepoViewHolder) { ((RepoViewHolder) holder).bind(itemRepo); } } } }
额外说明
另外注意一下,你的areContentsTheSame方法里原本用了oldItem == newItem,这在Java里是比较对象引用,建议改成oldItem.equals(newItem)(前提是Repo类正确重写了equals方法),这样才符合DiffUtil比较内容一致性的预期。
内容的提问来源于stack exchange,提问作者Kuba
相关产品推荐
相关产品推荐

