I tried to transfer a java class to a kotlin class, but meet some errors. Im working in Android studio.
The java code:
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.databinding.DataBindingUtil;
import androidx.databinding.ViewDataBinding;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
public abstract class BaseAdadper<V extends ViewDataBinding, D>
extends RecyclerView.Adapter<BaseAdadper.BaseViewHolder> {
private final String TAG = this.getClass().getSimpleName() + "_Base";
private List<D> mData = new ArrayList<>();
public abstract int getLayoutId();
public abstract void setItemHolder(@NonNull BaseViewHolder holder, int position, D d);
public void refresh(List<D> data) {
mData = data;
notifyDataSetChanged();
}
public List<D> getmData() {
return mData;
}
@NonNull
@Override
public BaseViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(getLayoutId(), parent, false);
return new BaseViewHolder(v);
}
@Override
public void onBindViewHolder(@NonNull BaseAdadper.BaseViewHolder holder, int position) {
if (mData != null && position < mData.size() && mData.get(position) != null) {
D d = mData.get(position);
setItemHolder(holder, position, d);
} else {
Log.e(TAG, "onBindViewHolder: data error :" + mData);
}
}
@Override
public int getItemCount() {
int count = mData.size();
Log.d(TAG, "getItemCount: " + count);
return count;
}
public class BaseViewHolder extends RecyclerView.ViewHolder {
public V bind;
public BaseViewHolder(@NonNull View itemView) {
super(itemView);
bind = DataBindingUtil.bind(itemView);
}
}
}
I tried to transfer it to kotlin:
import siger.common.base.BaseAdapterKo.BaseViewHolder
abstract class BaseAdapterKo<V : ViewDataBinding?, D> :
RecyclerView.Adapter<BaseViewHolder?>() {
private val TAG = this.javaClass.simpleName + "_Base"
private var mData: List<D?>? = ArrayList()
abstract val layoutId: Int
abstract fun setItemHolder(holder: BaseViewHolder, position: Int, d: D?)
fun refresh(data: List<D?>?) {
mData = data
notifyDataSetChanged()
}
fun getmData(): List<D?>? {
return mData
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder {
val v = LayoutInflater.from(parent.context).inflate(
layoutId, parent, false
)
return BaseViewHolder(v)
}
override fun onBindViewHolder(holder: BaseViewHolder, position: Int) {
if (mData != null && position < mData!!.size && mData!![position] != null) {
val d = mData!![position]
setItemHolder(holder, position, d)
} else {
Log.e(TAG, "onBindViewHolder: data error :$mData")
}
}
override fun getItemCount(): Int {
val count = mData!!.size
Log.d(TAG, "getItemCount: $count")
return count
}
inner class BaseViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
var bind: V?
init {
bind = DataBindingUtil.bind(itemView)
}
}
}
Error occurs near the RecyclerView.Adapter<BaseViewHolder?>:
Type arguments should be specified for an outer class 'BaseAdapterKo'. Use full class name to specify them