加载分页

本文探讨了加载分页的实现过程,包括网络请求接口的设计,使用网络工具类进行数据获取,M层的数据处理,视图V的展示,以及Presenter层的逻辑处理。同时,介绍了如何创建基类以提高代码复用性,如Adapter的基类,上下拉适配器,以及Fragment的抽基类。此外,还涉及到了相应的布局文件设计和MyApp全局配置,以及Fragment的懒加载策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

加载分页的接口

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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值