前言
本案例已经开源!如果你想免费下载,可以访问我的Github,所有案例均在上面,只求给个star。当然愿意支付小小金额请我喝茶也行(大学穷狗-.-)
一、准备工作
- 使用Android Studio开发
- 微信和QQ第三方sdk,需要自行申请(这个简单)
- 本案例使用干活集中营提供的api,使用MVp+Material Design作为主体架构进行开发
- 体验完整功能,点击下载APK
二、程序实现
目录结构
目录结构如下,我按照功能分包:
实现思路
整体架构–MVP+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()) {
/**
*