刚才遇到一个问题,编译通过,但是在打包时报错。
特在此记录一下。
下图中的BaseSimpleRecyclerAdapter是一个抽象类。
开发环境:
Android Studio 2.2
Build #AI-145.3276617, built on September 15, 2016
JRE: 1.8.0_76-release-b03 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
下面直接上关键代码:
- BaseSimpleRecyclerAdapter.java
package xml.zou.zohar.pte.recyclerviewdemo.adapter;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
import xml.zou.zohar.pte.recyclerviewdemo.R;
/**
* desc:抽象的,布局中只含一个TextView的RecyclerAdapter
* Created by Zohar on 2017/4/3.
*/
public abstract class BaseSimpleRecyclerAdapter<T> extends RecyclerView.Adapter<BaseSimpleRecyclerAdapter.ViewHolder> {
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
return new ViewHolder(view);
}
@Override
public int getItemCount() {
return dataList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
TextView textView;
ViewHolder(View itemView) {
super(itemView);
textView = (TextView) itemView.findViewById(R.id.text);
}
}
}
- HomeAdapter.java
package xml.zou.zohar.pte.recyclerviewdemo.adapter;
import android.view.View;
import java.util.List;
import xml.zou.zohar.pte.recyclerviewdemo.entity.HomeItem;
/**
* desc:首页RecyclerAdapter
* Created by Zohar on 2017/4/3.
*/
public class HomeAdapter extends BaseSimpleRecyclerAdapter<HomeItem> {
public HomeAdapter(List<HomeItem> dataList) {
super(dataList);
}
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
holder.textView.setText(dataList.get(position).getDesc());
holder.textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onItemClickListener != null) {
onItemClickListener.onItemClick(holder, position);
}
}
});
}
}
解释一下,
BaseSimpleRecyclerAdapter是一个抽象类,继承于RecyclerView.Adapter,只实现了其父类四个抽象方法中的三个,剩下的一个抽象方法onBindViewHolder(ViewHolder holder, int position)交由其子类去实现。HomeAdapter是BaseSimpleRecyclerAdapter的子类,实现剩下的一个抽象方法onBindViewHolder(ViewHolder holder, int position)。
上面所贴出的代码乍一看是没有问题的,而且sync的时候也通过了,没有报任何错误,上面所提到的问题出现在Build APK阶段。
解决办法:
public class HomeAdapter extends BaseSimpleRecyclerAdapter<HomeItem> {
......
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
......
}
}
改为
public class HomeAdapter extends BaseSimpleRecyclerAdapter<HomeItem> {
......
@Override
public void onBindViewHolder(final BaseSimpleRecyclerAdapter.ViewHolder holder, final int position) {
......
}
}
只修改了一个地方,就是将onBindViewHolder方法的第一个参数ViewHolder显式地指明为BaseSimpleRecyclerAdapter.ViewHolder,然后再次Build APK,成功!
细心一点会发现,我们明明是两个Error,为什么只改了一个位置,但是两个Error都被解决了呢?
其实,上面的解决办法修改的是下面这一个Error
Error:(13, 8) 错误: HomeAdapter不是抽象的, 并且未覆盖Adapter中的抽象方法onBindViewHolder(BaseSimpleRecyclerAdapter.ViewHolder,int)
至于另一个Error Error:(18, 5) 错误: 方法不会覆盖或实现超类型的方法
, 是因为这个方法是抽象父类的接口,可以不用@Overrride注解。当然就算你用@Overrride注解了,一般情况下也是不会有问题的。当然,如果说在今后出现了这个Error的话,不妨可以去掉@Overrride注解来试试看。