错误: XXXAdapter不是抽象的, 并且未覆盖Adapter中的抽象方法onBindViewHolder(ViewHolder,int)

一、问题描述

        在学习Android可侧滑删除的RecyclerView的时候,遇到了下面的报错

错误: SwipeDelAdapter不是抽象的, 并且未覆盖Adapter中的抽象方法onBindViewHolder(ViewHolder,int)
public class SwipeDelAdapter extends RecyclerView.Adapter {
       ^

        在上面的报错中,SwipeDelAdapter是我自定义的Adapter类。

        当我尝试通过Alt+Enter键修改代码时,Android Studio建议我实现onBindViewHolder这个方法。开发界面中的报错一共有两个:

        而我的代码为

package com.cs.blackbox.adapter;

import android.annotation.SuppressLint;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.cs.blackbox.R;

import java.util.List;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

public class SwipeDelAdapter extends RecyclerView.Adapter {

    private List list;
    private onAdapterItemClickListener itemClickListener;
    public SwipeDelAdapter(List list) {
        this.list = list;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(parent.getContext()).
                inflate(R.layout.item_text,parent,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, @SuppressLint("RecyclerView") final int position) {

        holder.sda_tv_content.setText(list.get(position).toString());
        holder.sda_tv_content.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                itemClickListener.onItemClick(view,position);
            }
        });

        holder.sda_tv_delete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                itemClickListener.onItemClick(view,position);
            }
        });
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    static class ViewHolder extends RecyclerView.ViewHolder{

        TextView sda_tv_content, sda_tv_delete;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            sda_tv_content=itemView.findViewById(R.id.sda_tv_content);
            sda_tv_delete=itemView.findViewById(R.id.sda_tv_delete);
        }
    }


    public void reFreshData(List list){
        this.list=list;
        notifyDataSetChanged();
    }


    public interface onAdapterItemClickListener{
        void onItemClick(View view,int selectPosition);
    }

    public void setItemClickListener(onAdapterItemClickListener itemClickListener) {
        this.itemClickListener = itemClickListener;
    }
}

        布局文件(item_text.xml)的代码为

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/sda_tv_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="数据"
        android:textSize="18sp"
        android:padding="15dp" />

    <TextView
        android:id="@+id/sda_tv_delete"
        android:layout_width="60dp"
        android:layout_height="match_parent"
        android:background="#FF0000"
        android:gravity="center"
        android:paddingEnd="16dp"
        android:paddingStart="16dp"
        android:textColor="@color/white"
        android:text="删除"
        android:textSize="18sp"/>
</LinearLayout>

        我通过网络搜索尝试了一些办法,但是没能解决。例如,参考博客Android踩坑的解决方案:将ViewHolder写到外面,使它作为一个与Adapter类同级的静态内部类,而不要放在Adapter类里面。该方案无法解决我的问题。以及,参考博客BaseRecyAdapter不是抽象的的解决方案:将ViewHolder类改为public static。该方案还是无法解决我的问题。

二、我的解决方法(仅供参考)

        1、将ViewHolder类还是放在Adapter类的内部。

        2、将XXXAdapter的继承修改一下,原来是这样继承的:

public class SwipeDelAdapter extends RecyclerView.Adapter{

}

        把它改成这样(添加一个<XXXAdaper.XXXViewHolder>,其中XXXAdapter和XXXViewHolder都是自定义的类,名字根据大家的项目和用途会有所不同):

public class SwipeDelAdapter extends RecyclerView.Adapter<SwipeDelAdapter.ViewHolder> {

}

        然后我的项目就build成功了。运行效果:

三、参考

        1、Android RecyclerView 二级列表侧滑简单实现,主要是参考了这一份代码。然而,这份代码的坑太多。

        2、天生要强注定要凉的博客

        3、Qin小宝的博客

        4、9527xiha的博客

猜你喜欢

转载自blog.csdn.net/qq_36158230/article/details/132194039