自定义万能适配器框架

万能适配器

public  abstract class BaseRvAdapter<T> extends  RecyclerView.Adapter<BaseRvAdapter.BaseViewHolder> {

    public List<T> dataList = new ArrayList<>();
    private IRecyclerItemClickListener iRecyclerItemClickListener;



    protected void setDataList(List<T> list){
        dataList=list;
    }

    @NonNull
    @Override
    public BaseViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View inflate = LayoutInflater.from(parent.getContext()).inflate(getLayoutId(viewType), parent, false);

        return new BaseViewHolder(inflate);
    }

    public abstract int getLayoutId(int viewType);

    @Override
    public void onBindViewHolder(@NonNull BaseViewHolder holder, int position) {

        displayViewHolder(holder,position,dataList.get(position));

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (iRecyclerItemClickListener != null){
                    iRecyclerItemClickListener.onItemClick(position);
                }
            }
        });

        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {

                if (iRecyclerItemClickListener != null){
                    iRecyclerItemClickListener.onItwmLongClick(position);
                }

                return true;
            }
        });

    }

    public abstract void displayViewHolder(BaseViewHolder holder,int position,T itemData);

    public void setiRecyclerItemClickListener(IRecyclerItemClickListener listener) {
        iRecyclerItemClickListener = listener;
    }

    @Override
    public int getItemCount() {
        return dataList.size();
    }

    public abstract int getRootViewType(int position);

    @Override
    public int getItemViewType(int position) {
        return getRootViewType(position);
    }

    public static class BaseViewHolder extends RecyclerView.ViewHolder{

        SparseArray<View> sparseArray = new SparseArray<>();

        public BaseViewHolder(@NonNull View itemView) {
            super(itemView);
        }

        public <V extends View> V getView(int id){
            if(sparseArray.get(id) != null){
                return (V)sparseArray.get(id);
            }else {
                V viewById = itemView.findViewById(id);

                sparseArray.put(id,viewById);
                return viewById;
            }
        }
    }


    public interface IRecyclerItemClickListener{
        void onItemClick(int position);
        void onItwmLongClick(int position);
    }

}

继承自万能适配器

package com.example.shoppingmallsix.adapter;

import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import androidx.recyclerview.widget.StaggeredGridLayoutManager;
import androidx.viewpager.widget.ViewPager;

import com.example.framework.BaseRvAdapter;
import com.example.framework.manager.ShopmallGlide;
import com.example.net.bean.HomeBean;
import com.example.net.constants.Constants;
import com.example.shoppingmallsix.BuildConfig;
import com.example.shoppingmallsix.R;
import com.example.shoppingmallsix.goods.GoodsActivity;
import com.youth.banner.Banner;
import com.youth.banner.loader.ImageLoader;

import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

public class HomeAdapter extends BaseRvAdapter<Object> {

    private final int BANNER_TYPE = 0;
    private final int CHANNEL_TYPE = 1;
    private final int ACT_TYPE = 2;
    private final int HOT_TYPE = 3;
    private final int RECOMMEND_TYPE = 4;
    private final int HOTT_TYPE = 5;
    private Context context;

    public HomeAdapter(List<Object> list, Context context) {
        setDataList(list);
        this.context = context;
    }

    @Override
    public int getLayoutId(int viewType) {

        int layoutId = -1;
        switch (viewType) {
            case BANNER_TYPE:
                layoutId = R.layout.home_banner;
                break;

            case CHANNEL_TYPE:
                layoutId = R.layout.home_recommend;
                break;

            case ACT_TYPE:
                layoutId = R.layout.home_viewpage;
                break;
            case HOT_TYPE:
                layoutId = R.layout.home_seckill;
                break;
            case RECOMMEND_TYPE:
                layoutId = R.layout.home_recommend1;
                break;
            case HOTT_TYPE:
                layoutId = R.layout.home_hot;
                break;
        }


        return layoutId;
    }

    @Override
    public void displayViewHolder(BaseViewHolder holder, int position, Object itemData) {
        switch (position) {
            case 0:
                List<HomeBean.ResultBean.BannerInfoBean> bannerInfoBeans = (List<HomeBean.ResultBean.BannerInfoBean>) itemData;
                if (BuildConfig.DEBUG)
                    Log.d("HomeAdapter", "bannerInfoBeans:" + bannerInfoBeans.toString());
                Banner banner = holder.getView(R.id.banner);
                banner.setImages(bannerInfoBeans);
                banner.setImageLoader(new ImageLoader() {
                    @Override
                    public void displayImage(Context context, Object path, ImageView imageView) {

                        HomeBean.ResultBean.BannerInfoBean bean = (HomeBean.ResultBean.BannerInfoBean) path;
                        String image = bean.getImage();

                        ShopmallGlide.with(holder.itemView.getContext())
                                .load(Constants.BASE_URl_IMAGE + image)
                                .into(imageView);

                    }
                });
                banner.start();
                break;

            case 1:

                List<HomeBean.ResultBean.ChannelInfoBean> channelInfoBeans = (List<HomeBean.ResultBean.ChannelInfoBean>) itemData;
                RecyclerView recyclerView = holder.getView(R.id.recommendRv);

                recyclerView.setLayoutManager(new StaggeredGridLayoutManager(5, StaggeredGridLayoutManager.VERTICAL));
                ChanneAdapter channeAdapter = new ChanneAdapter();
                recyclerView.setAdapter(channeAdapter);
                channeAdapter.dataList.addAll(channelInfoBeans);
                channeAdapter.setiRecyclerItemClickListener(new IRecyclerItemClickListener() {
                    @Override
                    public void onItemClick(int position) {

                    }

                    @Override
                    public void onItwmLongClick(int position) {

                    }
                });
                break;

            case 2:

                List<HomeBean.ResultBean.ActInfoBean> actInfoBeans = (List<HomeBean.ResultBean.ActInfoBean>) itemData;
                ViewPager vp = holder.getView(R.id.vp);

                ArrayList<ImageView> imageViews = new ArrayList<>();

                for (HomeBean.ResultBean.ActInfoBean actInfoBean : actInfoBeans) {
                    ImageView imageView = new ImageView(holder.itemView.getContext());
                    ShopmallGlide.with(holder.itemView.getContext()).load(Constants.BASE_URl_IMAGE + actInfoBean.getIcon_url())
                            .into(imageView);
                    imageViews.add(imageView);
                }

                ActAdapter actAdapter = new ActAdapter(imageViews);
                vp.setAdapter(actAdapter);

                break;
            case 3:
                List<HomeBean.ResultBean.SeckillInfoBean.ListBean> seckillInfoBeans = (List<HomeBean.ResultBean.SeckillInfoBean.ListBean>) itemData;
                RecyclerView seckillRecyclerView = holder.getView(R.id.fourRv);

                LinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);
                linearLayoutManager.setOrientation(RecyclerView.HORIZONTAL);
                seckillRecyclerView.setLayoutManager(linearLayoutManager);
                SeckillAdapter seckillAdapter = new SeckillAdapter();
                seckillRecyclerView.setAdapter(seckillAdapter);
                seckillAdapter.dataList.addAll(seckillInfoBeans);
                hours = holder.getView(R.id.hours_tv);
                minutes = holder.getView(R.id.minutes_tv);
                seconds = holder.getView(R.id.seconds_tv);
                startRun();
                seckillAdapter.setiRecyclerItemClickListener(new IRecyclerItemClickListener() {
                    @Override
                    public void onItemClick(int position) {
                        Intent intent = new Intent(holder.itemView.getContext(), GoodsActivity.class);
                        intent.putExtra("id", seckillInfoBeans.get(position).getProduct_id());
                        intent.putExtra("name", seckillInfoBeans.get(position).getName());
                        intent.putExtra("figure", seckillInfoBeans.get(position).getFigure());
                        intent.putExtra("price", seckillInfoBeans.get(position).getCover_price());
                        holder.itemView.getContext().startActivity(intent);
                    }

                    @Override
                    public void onItwmLongClick(int position) {

                    }
                });
                break;
            case 4:
                List<HomeBean.ResultBean.RecommendInfoBean> recommendInfoBeans = (List<HomeBean.ResultBean.RecommendInfoBean>) itemData;
                RecyclerView recommendRecyclerView = holder.getView(R.id.recommendRv);
                recommendRecyclerView.setLayoutManager(new GridLayoutManager(context, 3));
                RecommendAdapter recommendAdapter = new RecommendAdapter();
                recommendRecyclerView.setAdapter(recommendAdapter);
                recommendAdapter.dataList.addAll(recommendInfoBeans);
                recommendAdapter.setiRecyclerItemClickListener(new IRecyclerItemClickListener() {
                    @Override
                    public void onItemClick(int position) {
                        Intent intent = new Intent(holder.itemView.getContext(), GoodsActivity.class);
                        intent.putExtra("id", recommendInfoBeans.get(position).getProduct_id());
                        intent.putExtra("name", recommendInfoBeans.get(position).getName());
                        intent.putExtra("figure", recommendInfoBeans.get(position).getFigure());
                        intent.putExtra("price", recommendInfoBeans.get(position).getCover_price());
                        holder.itemView.getContext().startActivity(intent);
                    }

                    @Override
                    public void onItwmLongClick(int position) {

                    }
                });
                break;
            case 5:
                List<HomeBean.ResultBean.HotInfoBean> hotInfoBeans = (List<HomeBean.ResultBean.HotInfoBean>) itemData;
                RecyclerView hotRecyclerView = holder.getView(R.id.hotRv);
                hotRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
                HotAdapter hotAdapter = new HotAdapter();
                hotRecyclerView.setAdapter(hotAdapter);
                hotAdapter.dataList.addAll(hotInfoBeans);
                hotAdapter.setiRecyclerItemClickListener(new IRecyclerItemClickListener() {
                    @Override
                    public void onItemClick(int position) {
                        Intent intent = new Intent(holder.itemView.getContext(), GoodsActivity.class);
                        intent.putExtra("id", hotInfoBeans.get(position).getProduct_id());
                        intent.putExtra("name", hotInfoBeans.get(position).getName());
                        intent.putExtra("figure", hotInfoBeans.get(position).getFigure());
                        intent.putExtra("price", hotInfoBeans.get(position).getCover_price());
                        holder.itemView.getContext().startActivity(intent);
                    }

                    @Override
                    public void onItwmLongClick(int position) {

                    }
                });
                break;
        }
    }

    private long mHour = 23;//小时,
    private long mMin = 59;//分钟,
    private long mSecond = 59;//秒
    private TextView hours;
    private TextView minutes;
    private TextView seconds;
    private Timer timer = new Timer();

    Handler timeHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what == 1) {
                computeTime();
                hours.setText(getTv(mHour));
                minutes.setText(getTv(mMin));
                seconds.setText(getTv(mSecond));
                if (mSecond == 0 && mHour == 0 && mMin == 0) {
                    timer.cancel();
                }
            }
        }
    };


    private void computeTime() {
        mSecond--;
        if (mSecond < 0) {
            mMin--;
            mSecond = 59;
            if (mMin < 0) {
                mMin = 59;
                mHour--;
                if (mHour < 0) {
                    // 倒计时结束
                    mHour = 0;
                    mMin = 0;
                    mSecond = 0;
                }
            }
        }
    }

    private void startRun() {
        TimerTask mTimerTask = new TimerTask() {
            @Override
            public void run() {
                Message message = Message.obtain();
                message.what = 1;
                timeHandler.sendMessage(message);
            }
        };
        timer.schedule(mTimerTask, 0, 1000);
    }

    private String getTv(long l) {
        if (l >= 10) {
            return l + "";
        } else {
            return "0" + l;//小于10,,前面补位一个"0"
        }
    }

    @Override
    public int getRootViewType(int position) {

        int type = -1;

        switch (position) {
            case 0:
                type = BANNER_TYPE;
                break;
            case 1:
                type = CHANNEL_TYPE;
                break;

            case 2:
                type = ACT_TYPE;
                break;
            case 3:
                type = HOT_TYPE;
                break;
            case 4:
                type = RECOMMEND_TYPE;
                break;
            case 5:
                type = HOTT_TYPE;
                break;
        }

        return type;
    }
}

页面显示

package com.example.shoppingmallsix.fragment.home;


import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.example.framework.BaseFragment;
import com.example.framework.manager.LogUtil;
import com.example.framework.manager.MessageManager;
import com.example.framework.view.ToolBar;
import com.example.net.bean.HomeBean;
import com.example.shoppingmallsix.BuildConfig;
import com.example.shoppingmallsix.R;
import com.example.shoppingmallsix.adapter.HomeAdapter;
import com.example.shoppingmallsix.message.MessageActivity;
import com.umeng.message.PushAgent;

import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import org.greenrobot.eventbus.ThreadMode;

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

/**
 * A simple {@link Fragment} subclass.
 */
public class HomeFragment extends BaseFragment<HomePresenter> implements IHomeView,MessageManager.IMessage {
    private ToolBar toolbar;
    private EditText edtname;
    private RecyclerView rv;
    private HomeAdapter homeAdapter;
    private HomePresenter homePresenter;
    private List<Object> list = new ArrayList<>();
    private LinearLayout homeMessage;
    private TextView messageTv;

    public HomeFragment() {
        // Required empty public constructor
    }

    @Override
    protected void initPresenter() {
        homePresenter = new HomePresenter(this);
    }

    @Override
    protected void initData() {

        MessageManager.getInstance().register(this::onMessage);

        homePresenter.getHomeDData();

    }

    @Override
    protected void initView() {
        toolbar = (ToolBar) mBaseView.findViewById(R.id.toolbar);
        edtname = (EditText) mBaseView.findViewById(R.id.edtname);
        rv = (RecyclerView) mBaseView.findViewById(R.id.rv);
        homeMessage = mBaseView.findViewById(R.id.homeMessage);
        messageTv = mBaseView.findViewById(R.id.messageTv);
        PushAgent.getInstance(getContext()).onAppStart();
        homeAdapter = new HomeAdapter(list, getActivity());
        rv.setLayoutManager(new LinearLayoutManager(getContext()));
        rv.setAdapter(homeAdapter);

        homeMessage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(getActivity(), MessageActivity.class);
                startActivity(intent);
            }
        });
}

    @Override
    protected int getLayoutId() {
        return R.layout.fragment_home;
    }

    @Override
    public void getHomeData(HomeBean homeBean) {
        HomeBean.ResultBean result = homeBean.getResult();

        int count = MessageManager.getInstance().getCount();
        setCount(count);

        if (BuildConfig.DEBUG) Log.d("HomeFragment", "homeBean:" + homeBean);
        list.add(result.getBanner_info());
        list.add(result.getChannel_info());
        list.add(result.getAct_info());
        list.add(result.getSeckill_info().getList());
        list.add(result.getRecommend_info());
        list.add(result.getHot_info());

        loadingPage.showSuccessView();

        homeAdapter.notifyDataSetChanged();
    }

    @Override
    public void showLoading() {
        loadingPage.showTransparentLoadingView();
    }

    @Override
    public void hideLoading() {
    }

    @Override
    public void showToast(String msg) {
        loadingPage.showError(msg);
    }

    @Override
    public void onMessage(int count) {
        setCount(count);
    }

    public void setCount(int count){
        if (count<=0){
            messageTv.setText("消息");
        }else {
            messageTv.setText(count+"");
        }
    }
}

Presenter类

package com.example.shoppingmallsix.fragment.home;

import com.example.framework.BasePresenter;
import com.example.net.RetrofitCreator;
import com.example.net.bean.HomeBean;

import java.util.concurrent.TimeUnit;

import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Action;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;

public class HomePresenter extends BasePresenter<IHomeView> {

    public HomePresenter(IHomeView iHomeView) {
        attachView(iHomeView);
    }

    public void getHomeDData() {

        RetrofitCreator.getFiannceApiService().getHoemData()
                .delay(2, TimeUnit.SECONDS)
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe(new Consumer<Disposable>() {
                    @Override
                    public void accept(Disposable disposable) throws Exception {
                        add(disposable);
                        iView.showLoading();
                    }
                })
                .doFinally(new Action() {
                    @Override
                    public void run() throws Exception {
                        iView.hideLoading();
                    }
                })
                .subscribe(new Observer<HomeBean>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(HomeBean homeBean) {
                        if (iView != null) {
                            iView.getHomeData(homeBean);
                        }
                    }

                    @Override
                    public void onError(Throwable e) {
                        if (iView != null) {
                            iView.showToast(e.getMessage());
                        }
                    }

                    @Override
                    public void onComplete() {

                    }
                });

    }

}

View类

public interface IHomeView  extends IBaseView {

    void getHomeData(HomeBean homeBean);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值