万能适配器
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;
}
}
@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;
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() {
}
@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);
}