一、问题描述
在学习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@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.item_text,parent,false);return new ViewHolder(view);}@Overridepublic 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() {@Overridepublic void onClick(View view) {itemClickListener.onItemClick(view,position);}});holder.sda_tv_delete.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {itemClickListener.onItemClick(view,position);}});}@Overridepublic 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"><TextViewandroid: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" /><TextViewandroid: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的博客