Android:BaseRecyclerViewAdapter(RecyclerView 之 BaseAdapter)

本文介绍如何通过创建BaseAdapter来简化RecyclerView的开发过程,同时提供了短按和长按事件的接口实现,使得开发更加便捷高效。

RecyclerView已经出来了一段时间了,应该很多开发者也已经使用过,至于更多的关于RecyclerView的百度吧。

在使用RecyclerView时,它的adapter是RecyclerView.Adapter,在我开始使用中,每次都会写很多重复的东西,仔细看看,其实也是可以抽出一个BaseAdapter,这样开发更快捷,同时也提供短按和长按接口,代码如下:

BaseRecyclerViewAdapter.java

package com.hmy

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by HMY on 2015/12/25.
 */
public abstract class BaseRecyclerViewAdapter<T> extends RecyclerView.Adapter<BaseViewHolder> {

    protected Context mContext;
    protected List<T> mList;
    protected RecyclerView mRecyclerView;

    private OnItemClickListener mOnItemClickListener;
    private OnItemLongClickListener mOnItemLongClickListener;

    public BaseRecyclerViewAdapter(Context context) {
        mContext = context;
    }

    @Override
    abstract public BaseViewHolder onCreateViewHolder(ViewGroup viewGroup, int i);

    @Override
    public void onBindViewHolder(BaseViewHolder baseViewHolder, int i) {

        baseViewHolder.setOnItemClickListener(new BaseViewHolder.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
                if (mOnItemClickListener != null) {
                    mOnItemClickListener.onItemClick(view, position);
                }
            }
        });
        baseViewHolder.setOnItemLongClickListener(new BaseViewHolder.OnItemLongClickListener() {
            @Override
            public void onItemLongClick(View view, int position) {
                if (mOnItemLongClickListener != null) {
                    mOnItemLongClickListener.onItemLongClick(view, position);
                }
            }
        });
    }

    @Override
    public int getItemCount() {
        return mList == null ? 0 : mList.size();
    }

    public int getItemViewHeight() {
        return 0;
    }

    public void setList(List<T> list) {
        this.mList = list;
    }

    public List<T> getList() {
        return mList;
    }

    public void setList(T[] list) {
        ArrayList<T> arrayList = new ArrayList<T>(list.length);
        for (T t : list) {
            arrayList.add(t);
        }
        setList(arrayList);
    }

    public RecyclerView getRecyclerView() {
        return mRecyclerView;
    }

    public void setRecyclerView(RecyclerView recyclerView) {
        mRecyclerView = recyclerView;
    }

    public void setOnItemClickListener(OnItemClickListener l) {
        mOnItemClickListener = l;
    }

    public void setOnItemLongClickListener(OnItemLongClickListener l) {
        mOnItemLongClickListener = l;
    }

    public interface OnItemClickListener {
        void onItemClick(View view, int position);
    }

    public interface OnItemLongClickListener {
        void onItemLongClick(View view, int position);
    }

}


BaseViewHolder.java

由于RecyclerView规范了ViewHolder的使用,所以BaseViewHolder也是需要的。

package com.hmy;

import android.support.v7.widget.RecyclerView;
import android.view.View;

/**
 * Created by HMY on 2015/12/25.
 */
public class BaseViewHolder extends RecyclerView.ViewHolder {

    private OnItemClickListener mOnItemClickListener;
    private OnItemLongClickListener mOnItemLongClickListener;

    public BaseViewHolder(View itemView) {
        super(itemView);
        itemView.setOnClickListener(new OnClickLis());
        itemView.setOnLongClickListener(new OnLongClickLis());
    }

    private class OnClickLis implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            if (mOnItemClickListener != null) {
                mOnItemClickListener.onItemClick(v, getPosition());
            }
        }
    }

    private class OnLongClickLis implements View.OnLongClickListener {

        @Override
        public boolean onLongClick(View v) {
            if (mOnItemLongClickListener != null) {
                mOnItemLongClickListener.onItemLongClick(v, getPosition());
                return true;
            }
            return false;
        }
    }

    public void setOnItemClickListener(OnItemClickListener l) {
        mOnItemClickListener = l;
    }

    public void setOnItemLongClickListener(OnItemLongClickListener l) {
        mOnItemLongClickListener = l;
    }

    public interface OnItemClickListener {
        void onItemClick(View view, int position);
    }

    public interface OnItemLongClickListener {
        void onItemLongClick(View view, int position);
    }
}

下面是一个TestAdapter

package com.hmy;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.hmy.R;
import com.hmy.TestModel;

/**
 * Created by HMY on 2015/12/25.
 */
public class RecyclerViewTestAdapter extends BaseRecyclerViewAdapter<TestModel> {

    public RecyclerViewTestAdapter(Context context) {
        super(context);
    }

    @Override
    public BaseViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(mContext).inflate(R.layout.item_layout,
                viewGroup, false);

        TestViewHolder viewHolder = new TestViewHolder(v);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(BaseViewHolder baseViewHolder, int i) {
        super.onBindViewHolder(baseViewHolder, i);
        TestViewHolder holder = (TestViewHolder) baseViewHolder;//这里需要强转,与onCreateViewHolder中的ViewHolder一致

        holder.textTv.setText(mList.get(i).text);
    }

    private class TestViewHolder extends BaseViewHolder {

        public TextView textTv;

        public TestViewHolder(View itemView) {
            super(itemView);
            textTv = (TextView) itemView.findViewById(R.id.tv_text);
        }
    }
}


TestModel.java

package com.hmy;

import java.io.Serializable;

/**
 * Created by HMY on 2015/12/25.
 */
public class TestModel implements Serializable {

    public String text = "";
}






implementation(libs.appcompat) implementation(libs.material) implementation(libs.constraintlayout) implementation(libs.lifecycle.livedata.ktx) implementation(libs.lifecycle.viewmodel.ktx) implementation(libs.navigation.fragment) implementation(libs.navigation.ui) testImplementation(libs.junit) androidTestImplementation(libs.ext.junit) androidTestImplementation(libs.espresso.core) implementation (com.google.code.gson:gson:2.8.9) implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.11.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.3' implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1' implementation 'androidx.navigation:navigation-fragment:2.4.1' implementation 'androidx.navigation:navigation-ui:2.4.1' // implementation libs.androidx.core.ktx testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.3' androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0' // 网络请求 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // 表格控件 implementation 'io.github.cymchad:BaseRecyclerViewAdapterHelper:4.0.3' // implementation 'io.github.cymchad:BaseRecyclerViewAdapterHelper:4.1.7' implementation 'androidx.recyclerview:recyclerview:1.3.2' // 刷新控件 implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0' // Material Design implementation 'com.google.android.material:material:1.11.0' // 对话框 implementation 'com.github.gabriel-TheCode:AestheticDialogs:1.3.6' implementation 'at.favre.lib:bcrypt:0.9.0' // Android专用BCrypt库 implementation 'androidx.room:room-runtime:2.4.3' annotationProcessor 'androidx.room:room-compiler:2.4.3' 转化为2024
06-05
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值