get Error when Transfer a java abstract class with generics and inner class to kotlin code

Viewed 38

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

0 Answers
Related