项目总结,独立开发,周期2月

最近花了将近2个月时间,总算完成了一个完整的项目,从初始的框架搭建,到后面的应用上线,首先都得感谢一个朋友,要是没有他,这个项目也不会上线。特别感谢小王同志,交了一个好朋友,在生活在工作中都可以的到受益。好了开始讲讲项目。最后我会把项目源码上传到guitub,csdn上面,欢迎大家下载,查看完整的代码;
     
在这个一个项目中,学到了许多,但是都还没有消化,需要总结,但总算对一个项目的搭建到最后上线有了一个清晰的认识,在这个项目中,我对此倾注了2月的心血,也将近2月都没有个人时间,经常半夜加班到1-2点,有时甚至还通宵,就是为了赶项目进度,虽然最后结果不太好,但是我不会对自己的付出感到后悔。


在这个项目中集成了: 个推、  springview刷新控件,友盟分享,友盟统计,Glide图片加载框架,网络请求使用OkHttpUtils框架,recycleview使用, EventBus消息通知 ,还有集成了乐视视频,和一个图片选择器,smarttablayout控件、最后这些具体集成方法都会另外开篇介绍。项目使用的是MVC架构,自定义了baseactivity,baseFragment,和一个lcapp继承application的基类、里面定义了全局的contenxt,butterknife控件的绑定和一些集成的初始化操作。
项目技术亮点: 1
eventBus消息通信、个推绑定别名、图片选择器仿微信9宫格, 乐视视频集成皮肤功能播放,功能性点赞,来看看项目截图 



没办法截图没办法上, 所以就直接给连接吧。http://download.csdn.net/detail/fzx19910714/9820025下载源码的连接



以上就是项目整体架构和效果图
项目虽然简单但是倾注了太多的心血!!
首先讲讲登录注册这个模块:在登录的时候这些简单的UI布局就不说了,来讲讲登录注册的实现,在点击登录的时候需要请求服务器,来校验账号密码如果账号密码错误需要提示,如果还未注册,提示用户注册,密码错误连续5次错误,锁定账号,需要修改密码才能在次登录。在登录的这个逻辑中有集成个推,绑定别名来让后台推送消息。
登录成功以后页面跳转回一个fragment,并展示用户名和头像,点击头像就可以跳转用户中心, 里面可以修改个人的一些属性,如上图的个人资料, 还有一个添加头像,选择后头像上传到服务器,并提示成功,所有的这个用户中心要掌握的就是activity或者是fragment的生命周期, 在生命周期中完成你要完成的逻辑。
用户注册这个功能:在这个界面中也是完成了UI布局,然后在处理注册手机号的验证判断,点击发送验证码,然后倒计时60s,验证输入的密码和再次输入的密码的一致性,注册成功以后销毁当前界面跳转到用户登录的界面。                  --------忘记密码同理
        在这个fragment中完成用户展示,并且还有一个《设置》的界面在这边实
现了清除缓存, 修改密码,退出登录,和当前网络状态的判断,是否决定在 无WIFI的情况下观看视频。      具体代码就不贴了, 在项目里面原原本本都有。


然后讲讲首页的这个模块:
在首页这边展示的是一个viewpager+listview展示数据。然后viewpager点击后进入的是一个webview的界面,这边就不说了一些功能都比较倾向性的逻辑判断,不过在这个带解答的地方确实当时确实有卡住一段时间,因为就是不能让他完成跳转到第三个fragmnet的界面,最后代码如下,才实现跳转成功。




这样就让我的homefragment选中了<我要答>的这个fragment,
在首页的时候有个心情,这边就有比较多的坑了,图片的gridview的展示,还有发布心情的图片选择与添加图片的选择,还有listview嵌套gridview 展示不全,条目复用的问题。在这边图片选择器我使用的框架是
compile 'cn.finalteam:galleryfinal:1.4.8.7'
大家有时间可以看下, 挺强大的,可以裁剪,可以单选、多选、拍照等一些。              在这个心情之中还有点赞功能, 点赞这个功能也是需要连接服务器
viewHolder.mMoodItemZanView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {


        viewHolder.mMoodItemZanView.setEnabled(false);


        String zanurl = Constants.Base_Url + "appConsulting/addBlogLiked";
        String userid = PreferenceUtils.getPrefString(mContext, Constants.USER_ID, "");
        if (TextUtils.isEmpty(userid)) {
            ToastUtils.show("请登录");
            Intent logIn = new Intent(mContext, User_Login_Activity.class);
            logIn.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            mContext.startActivity(logIn);
            return;
        }
        OkHttpUtils.post().url(zanurl)
                .addParams("userId", userid + "")
                .addParams("blogId", id + "")
                .build().execute(new Callback<ImageBean>() {
            @Override
            public ImageBean parseNetworkResponse(Response response, int id) throws Exception {
                if (response != null && response.isSuccessful()) {
                    String result = response.body().string();
                    Log.e(TAG, "result: " + result);
                    return new Gson().fromJson(result, ImageBean.class);
                }
                return null;
            }


            @Override
            public void onError(Call call, Exception e, int id) {
                viewHolder.mMoodItemZanView.setEnabled(true);
                ToastUtils.show("请检查网络");
            }


            @Override
            public void onResponse(ImageBean response, int id) {


                if (response != null) {
                    if (response.isSuccess()) {
                        int position = (int) viewHolder.mMoodItemZanView.getTag();
                        MoodBean.EntityBean.BlogListBean temp = mList.get(position);
                        temp.setLikedNum(temp.getLikedNum() + 1);
                        temp.setLikedId("点赞成功");


                        mList.set(position, temp);
                        viewHolder.mMoodItemZanView.setEnabled(false);


                    } else {


                        viewHolder.mMoodItemZanView.setEnabled(true);//
                    }
                } else {
                    viewHolder.mMoodItemZanView.setEnabled(true);//
                }
                notifyDataSetChanged();
            }
        });
    }
});


在这个图片展示的gridview中, 还有一个点击图片放大的功能。
//点击九宫格,查看大图
viewHolder.mGridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        ArrayList<MoodBean.EntityBean.BlogListBean.BlogImageBean> mImageStringList =
                (ArrayList<MoodBean.EntityBean.BlogListBean.BlogImageBean>) viewHolder.mGridview.getTag();
        imageBrower(position, mImageStringList);
    }
});


private void imageBrower(int position, ArrayList<MoodBean.EntityBean.BlogListBean.BlogImageBean> list) {
    Intent intent = new Intent(mContext, ImagePagerActivity.class);
    intent.putParcelableArrayListExtra(ImagePagerActivity.EXTRA_IMAGE_URLS, list);
    intent.putExtra(ImagePagerActivity.EXTRAIMAGE_INDEX, position);
    mContext.startActivity(intent);
}


在添加图片的时候我的布局之中是写了一个recycleview  如下图:
当然在recycleview其中的适配器的逻辑 在代码之中,比较多,就不贴出来了。有需要的可以下载源码查看Moodandmood其中的adpater。
然后就是心情详情的展示了。当然也需要一个gridview展示,这一个详情是使用的是一个listview添加一个头部的方法来实现的。这样数据展示效果会比分开(一个listview+一个写死的布局好调整多了,这边还有一个坑,那就是edittext控件和button控件会抢夺listview控件的焦点。 可以在它们的布局上面设focurseable设置为False来解决遇到的问题,   还有就是这边会遇到条目展示不全的问题。)。。。详情看源码。


接下来讲讲这个专家这个fragment ,因为这个fragment里面里面使用了smarttablayout+viewpager,每一个页面展示的数据又都不一样,在这个专家的fragment中,又单独写了一个baseprofessorFragment,来实现封装,里面写了一些公共的方法比如下拉刷新,上拉加载更多等逻辑。减少代码量,节约时间。在专家这边还有就是搜索功能,没有去实现搜索记录保存,,每一次的搜索完毕就清空搜索,如果搜索无结果返回为空。
如果有结果就展示一个listview并搜索结果item的跳转跳转到专家详情之中去。。。。。
在专家详情中,可以查看专家心情,专家评论和专家课程等信息,视频的入口也在专家的课程之中,在点击到专家详情的时候需要把所有专家的id和position位置信息传进去,用做专家详情的查看上一个专家,和下一个专家,专家大致逻辑就是这样。视频那边需要传一个点击视频的UUid,然后视频才可以观看,
在我要问的这个模块之中:
也有gridview展示checkbox单选,和添加图片的recycleview当然添加图片的逻辑就是上面的说的发送心情差不多
发布问题之中也需要用到EventBus,先发送图片的时候需要先上传图片,由服务器返回一个图片的路径地址,最后在和文字一起上传服务器。而且图片需要精要压缩。不然在正式环境图片应该会发送失败, wifi情况下发大图每张图片3-4M的这样的高清图,就算在这种情况下也是很容易失败的。所以发送图片需要经过质量压缩。
这样整个项目应该就算大体完成了。下次会提交集成的第三方的使用方法。给自己和大家做一个总结。
这个项目有还有存在bug,希望大家多多指正。个人QQ:229037623,大家如果有疑问可以问我,不一定能回答上,但一定尽力。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值