Android--从零开始开发一款文章阅读APP

代码地址如下:
http://www.demodashi.com/demo/11212.html

前言

本案例已经开源!如果你想免费下载,可以访问我的Github,所有案例均在上面,只求给个star。当然愿意支付小小金额请我喝茶也行(大学穷狗-.-)

一、准备工作

  • 使用Android Studio开发
  • 微信和QQ第三方sdk,需要自行申请(这个简单)
  • 本案例使用干活集中营提供的api,使用MVp+Material Design作为主体架构进行开发
  • 体验完整功能,点击下载APK

二、程序实现

目录结构

目录结构如下,我按照功能分包:
目录结果

实现思路

整体架构–MVP+Material
  • 首先你得了解MVP架构在android中的使用,如果你还不了解,可以阅读我的这篇文章
  • 如果你不熟悉Material可以读官方文档
重点代码分析

如果讲述整个App,估计一篇文章说不清楚。那我干脆取其中一条线来分析。
下面主要分析文章列表–文章详情–文章分享

主页文章列表

这里只选择Android文章模块进行介绍:
主页列表

GankContract
public interface GankContract {
   
    interface View extends BaseView<Presenter>{
   
        //错误
        void showError();
        //正在加载
        void showLoading();
        //停止加载
        void Stoploading();
        //显示数据列表
        void showResult(ArrayList<GankNews.Question> list);
        //网络错误
        void showNotNetError();

    }
    interface Presenter extends BasePresenter{
   
        // 请求数据
        void loadPosts(int PagerNum, boolean cleaing);
        //刷新数据
        void  reflush();
        //加载更多
        void loadMore(int PagerNum);
        //显示详情
        void StartReading(int positon);
        //随便看看
        void LookAround();
    }
}
GankFragment

Fragment的内容主要是文章列表,我们只分享重点:

//下拉刷新实现
recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
            boolean isScrollState=false;
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                LinearLayoutManager manager= (LinearLayoutManager) recyclerView.getLayoutManager();
                //没有滚动时候
                if (newState==RecyclerView.SCROLL_STATE_IDLE){
                    //获的最后一个可见的item
                    int lastVisibilityItem=manager.findLastCompletelyVisibleItemPosition();
                    int totalItemCount=manager.getItemCount();

                    //判断是否滚动到底部并且是向下滑动
                    if (lastVisibilityItem==(totalItemCount-1)&&isScrollState){
                        presenter.loadMore(1);
                    }
                }

            }

//通知Presenter加载数据和设置item点击事件
@Override
    public void showResult(ArrayList<GankNews.Question> list) {
        if (adapter==null){
            Log.i(TAG, "showResult: "+list.size());
            adapter=new GankNewsAdapter(list,getContext());
            adapter.setItemOnClickListener(new OnRecyclerViewOnClickListener() {
                @Override
                public void onItemClick(View v, int position) {
                    presenter.StartReading(position);
                }

                @Override
                public void onItemLongClick(View v, int position) {

                }
            });
            recyclerView.setAdapter(adapter);
        }else {
            adapter.notifyDataSetChanged();
        }
    }
GankPresenter

同样只分析重点代码:

//根据当前页数加载列表数据
 @Override
    public void loadPosts(int PagerNum, final boolean cleaing) {
        CurrentPagerNum=PagerNum;
        if (cleaing) {
            view.showLoading();
        }
        if (Network.networkConnected(context)) {
            model.load(Api.Gank_Android + PagerNum, new OnStringListener() {
                @Override
                public void onSuccess(String result) {
                    try {
//                        Log.i(TAG, "gankpresenter.model.load.result"+result);
                        GankNews news = gson.fromJson(result, GankNews.class);
                        //contenvalues只能存储基本类型的数据,像string,int之类的,不能存储对象这种东西,而HashTable却可以存储对象。
//                        ContentValues values = new ContentValues();
                        if (cleaing) {
                            list.clear();
                        }
                        for (GankNews.Question item : news.getResults()) {
                            /**
                             *
  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值