加载分页的接口
public class Api {
//接口http://mnews.gw.com.cn/wap/data/news/news/mobile/jbgg/page_1.json
public static final String Base_Url="http://mnews.gw.com.cn/wap/data/news/news/";
public static final String Main_url="mobile/jbgg/page_";
}
public interface ApiService {
@GET(Api.Main_url+"{page}")
Flowable<List<MyBean>> getShow(@Path("page")String page);
}
网络请求
public class RetrofitUtils {
/**
* 单例模式
*/
private static RetrofitUtils retrofitUtils;
public RetrofitUtils(){
}
public static RetrofitUtils getInstance(){
if (retrofitUtils==null)
synchronized (RetrofitUtils.class){
if (retrofitUtils==null){
retrofitUtils=new RetrofitUtils();
}
}
return retrofitUtils;
}
/**
* 获取OkhTTP
*/
private static OkHttpClient okHttpClient;
private static synchronized OkHttpClient getOkHttpClient(){
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
}
});
okHttpClient = new OkHttpClient.Builder()
.addInterceptor(interceptor.setLevel(HttpLoggingInterceptor.Level.BODY ))
.readTimeout(3000,TimeUnit.SECONDS)
.writeTimeout(3000,TimeUnit.SECONDS)
.build();
return RetrofitUtils.okHttpClient;
}
/**
* 获取Retrofit
*/
private static Retrofit retrofit;
private static synchronized Retrofit getRetrofit(String url){
retrofit = new Retrofit.Builder()
.baseUrl(url)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(getOkHttpClient())
.build();
return retrofit;
}
/**
* 获取动态代理
*/
public <T> T doGet(String url,Class<T> apiService){
Retrofit retrofit = getRetrofit(url);
T t = retrofit.create(apiService);
return t;
}
}
网络工具类
public class NetWorkUtils {
public static boolean getNetWork(Context context){
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = manager.getActiveNetworkInfo();
if (info!=null){
return info.isAvailable();
}
return false;
}
}
M层
public class OneModel {
public void getHttpData(String page){
ApiService apiService = RetrofitUtils.getInstance().doGet(Api.Base_Url, ApiService.class);
Flowable<List<MyBean>> show = apiService.getShow(page);
show.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(new DisposableSubscriber<List<MyBean>>() {
@Override
public void onNext(List<MyBean> myBeans) {
MyBean myBean = myBeans.get(0);
List<MyBean.DataBean> data = myBean.getData();
if (oneLisetener!=null){
oneLisetener.onOne(data);
}
}
@Override
public void onError(Throwable t) {
}
@Override
public void onComplete() {
}
});
}
public interface onOneLisetener{
void onOne(List<MyBean.DataBean> data);
}
onOneLisetener oneLisetener;
public void setOneLisetener(onOneLisetener oneLisetener){
this.oneLisetener=oneLisetener;
}
}
V
public interface OneView {
void getViewData(List<MyBean.DataBean> data);
}
p
public class OnePresenter extends Basepresenter<OneView>{
private OneView oneView;
private OneModel oneModel;
public OnePresenter(OneView view){
this.oneView=view;
oneModel=new OneModel();
}
public void onRelated(String page){
oneModel.getHttpData(page);
oneModel.setOneLisetener(new OneModel.onOneLisetener() {
@Override
public void onOne(List<MyBean.DataBean> data) {
oneView.getViewData(data);
}
});
}
}
p层抽基类
public abstract class Basepresenter<T> {
private Reference<T> tReference;
public void attachView(T t){
tReference = new WeakReference<>(t);
}
public void deatchView(){
if (tReference!=null){
tReference.clear();
tReference=null;
}
}
}
适配器
public class MyAdapter extends RecyclerView.Adapter{
private Context context;
private List<MyBean.DataBean> list;
private final static int TYPE_CONTENT=0;//正常内容
private final static int TYPE_FOOTER=1;//下拉刷新
public MyAdapter(Context context,List<MyBean.DataBean> list){
this.context=context;
this.list=list;
}
@Override
public int getItemViewType(int position) {
/**
* 判断集合长度到最后条目的时候就显示底部条目样式(一个加载进度圈)
*/
if (position==list.size()){
return TYPE_FOOTER;
}
return TYPE_CONTENT;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
if (i==TYPE_CONTENT){
View view = LayoutInflater.from(context).inflate(R.layout.one_tiem, viewGroup, false);
return new MyViewHoder(view);
}
else {
View view = LayoutInflater.from(context).inflate(R.layout.footer_layout, null);
return new FooterViewHolder(view);
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
int itemViewType = getItemViewType(i);
//类型为内容时正常赋值
if (itemViewType==TYPE_CONTENT){
MyViewHoder myViewHolder= (MyViewHoder) viewHolder;
myViewHolder.name.setText(list.get(i).getTitle());
}else {
}
}
@Override
public int getItemCount() {
return list.size()+1;
}
public class MyViewHoder extends RecyclerView.ViewHolder {
private final TextView name;
public MyViewHoder(@NonNull View itemView) {
super(itemView);
name= itemView.findViewById(R.id.item_name);
}
}
/**
* 底部FooterViewHolder
*/
public class FooterViewHolder extends RecyclerView.ViewHolder {
private final ContentLoadingProgressBar pb_progress;
public FooterViewHolder(@NonNull View itemView) {
super(itemView);
pb_progress = itemView.findViewById(R.id.pb_progress);
}
}
}
上下拉的适配器
public abstract class onLoadMoreListener extends RecyclerView.OnScrollListener {
private int countItem;
private int lastItem;
private boolean isScolled = false;//是否可以滑动
private RecyclerView.LayoutManager layoutManager;
/**
* 加载回调方法
* @param countItem 总数量
* @param lastItem 最后显示的position
*/
protected abstract void onLoading(int countItem, int lastItem);
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
//拖拽或者惯性滑动时isScolled设置为true
if (newState == SCROLL_STATE_DRAGGING || newState == SCROLL_STATE_SETTLING) {
isScolled = true;
} else {
isScolled = false;
}
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (recyclerView.getLayoutManager() instanceof LinearLayoutManager){
layoutManager = recyclerView.getLayoutManager();
countItem= layoutManager.getItemCount();
lastItem=((LinearLayoutManager) layoutManager).findLastCompletelyVisibleItemPosition();
}if (isScolled&&countItem!=lastItem&&lastItem==countItem-1){
onLoading(countItem,lastItem);
}
}
}
Fragment的抽基类
public abstract class BaseFragment<T extends Basepresenter> extends Fragment {
private T presenter;
private View view;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(getLayout(), container, false);
return view;
}
@Override
public void onDestroy() {
super.onDestroy();
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
presenter = getPresenter();
presenter.attachView(presenter);
intoview(view);
initdata();
}
protected abstract int getLayout();
protected abstract void initdata();
protected abstract void intoview(View view);
protected abstract T getPresenter();
@Override
public void onDetach() {
super.onDetach();
presenter.deatchView();
}
}
对应的布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
xmlns:app="http://schemas.android.com/apk/res-auto"
>
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/image"
android:layout_width="100dp"
android:layout_height="100dp"
app:placeholderImage="@drawable/hahaha"
app:roundedCornerRadius="20dp"/>
<TextView
android:id="@+id/item_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginStart="144dp"
android:layout_marginLeft="144dp"
android:layout_marginTop="31dp"
android:text="222" />
</RelativeLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.widget.ContentLoadingProgressBar
android:id="@+id/pb_progress"
style="?android:attr/progressBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" />
</LinearLayout>
MyApp
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
Fresco.initialize(this);
}
}
Fragment
public class FragmentOne extends BaseFragment<OnePresenter> implements OneView {
@BindView(R.id.rec)
RecyclerView rec;
@BindView(R.id.swiperefreshlayout)
SwipeRefreshLayout swiperefreshlayout;
Unbinder unbinder;
private List<MyBean.DataBean> list;
private int page = 1;
private Handler handler = new Handler();
private OnePresenter presenter;
private boolean netWork;
private MyAdapter myAdapter;
@Override
protected int getLayout() {
return R.layout.fragmetone;
}
@Override
protected void intoview(View view) {
unbinder = ButterKnife.bind(this, view);
//网络判断
netWork = NetWorkUtils.getNetWork(getContext());
//设置
rec.setLayoutManager(new LinearLayoutManager(getContext()));
rec.addItemDecoration(new DividerItemDecoration(getContext(), OrientationHelper.VERTICAL));
}
@Override
protected OnePresenter getPresenter() {
presenter = new OnePresenter(this);
return presenter;
}
@Override
protected void initdata() {
/**
* 下拉刷新
*/
swiperefreshlayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
if (netWork) {
page = 1;
presenter.onRelated(page + ".json");
handler.postDelayed(new Runnable() {
@Override
public void run() {
swiperefreshlayout.setRefreshing(false);
}
}, 3000);
} else {
//没网吐司圆圈转1s
Toast.makeText(getContext(), "当前无网络", Toast.LENGTH_SHORT).show();
handler.postDelayed(new Runnable() {
@Override
public void run() {
swiperefreshlayout.setRefreshing(false);
}
}, 1000);
}
}
});
/**
* 上拉加载
*/
rec.addOnScrollListener(new onLoadMoreListener() {
@Override
protected void onLoading(int countItem, int lastItem) {
if (netWork) {
page++;
presenter.onRelated(page + ".json");
handler.postDelayed(new Runnable() {
@Override
public void run() {
swiperefreshlayout.setRefreshing(false);
}
}, 3000);
} else {
//没网吐司圆圈转1s
Toast.makeText(getContext(), "当前无网络", Toast.LENGTH_SHORT).show();
swiperefreshlayout.setRefreshing(false);
}
}
});
//有网网络默认请求
presenter.onRelated(page + ".json");
}
@Override
public void getViewData(List<MyBean.DataBean> data) {
if (page == 1) {
list = new ArrayList<>();
list.addAll(data);
if (list.size() != 0) {
myAdapter = new MyAdapter(getContext(), list);
rec.setAdapter(myAdapter);
myAdapter.notifyDataSetChanged();
//控制分页加载
//显示最新加载出的第一条
int itemCount = myAdapter.getItemCount();
rec.scrollToPosition(itemCount - (data.size() + 1));
}
}
}
}
Fragment懒加载
public class FragmentTwo extends Fragment {
//Fragment的View加载完毕的标记
private boolean isViewCreated;
//Fragment对用户可见的标记
private boolean isUIVisible;
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
isViewCreated = true;
lazyLoad();
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
//isVisibleToUser这个boolean值表示:该Fragment的UI 用户是否可见
if (isVisibleToUser) {
isUIVisible = true;
lazyLoad();
} else {
isUIVisible = false;
}
}
private void lazyLoad() {
//这里进行双重标记判断,是因为setUserVisibleHint会多次回调,并且会在onCreateView执行前回调,必须确保onCreateView加载完毕且页面可见,才加载数据
if (isViewCreated && isUIVisible) {
loadData();
//数据加载完毕,恢复标记,防止重复加载
isViewCreated = false;
isUIVisible = false;
}
}
private void loadData() {
Log.e("xxx","2222");
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragmettwo, container, false);
return view;
}
}