Error:(13, 8) 错误: xxx不是抽象的, 并且未覆盖xxx中的抽象方法onBindViewHolder(BaseSimpleRecyclerAdapter.ViewHolder,int)

刚才遇到一个问题,编译通过,但是在打包时报错。
特在此记录一下。
下图中的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 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注解来试试看。

你可能感兴趣的:(Error,记录)