一、问题描述
在学习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的博客