最近快半个月没写博客,不是偷懒而是在整理一些思路,最近的项目中开始尝试使用新框架,也一直在改进中,最后觉得差不多了准备开源出来。10分钟开发网易新闻首页有点夸大其词,但是在我的Demo中修改一下样式基本就能满足大多数新闻客户端的需求了,其他的APP更不在话下。
布局文件如下
代码就只有这么多
效果很爽
1.使用起来很简单,先看代码
这是BaseFragment继承自SmartListFragment,而SmartListFragment就是我框架中的类了,这里面返回了当前应用的分页策略,方便统一控制。
而首页中就返回了一个配置文件的名字,这个配置文件放在res/raw下的。一切的黑科技都从配置文件开始
我们来看看配置文件长什么样。就是一个很简单的json文件,为了方便截图我收缩了一部分。
上面的文件对应于这个类
而JsonAnalysisConfig定义如下:
可能大家还不是很清楚,我给大家做一个例子,大家就明白了。以解析生成这个为例:
首先整体的数据结构如下
我们关心的是这一部分
使用它去生成一个javabean,名字就叫channelItem可以使用Android Studio的Gson生成插件。
接着我们编写ViewHolder。
这是源码很短,很简单实现了解耦:
h.smartdemo.viewholder;t.Context;h.smartdemo.R;
h.smartdemo.adapter.ChannelAdapter;
h.smartdemo.bean.ChannelItem;
h.smartdemo.util.ClickHelper;
h.smartdemo.view.ChannelPageIndicator;
h.smartdemo.view.PageGridView;
h.smartlibrary.adapter.SmartAdapter;import java.util.ArrayList;
import java.util.List;/*** Created by zhuguohui on 2016/8/17.*/
public class ChannelViewHolder extends SmartAdapter.SmartViewHolder<Object> {@Overridepublic boolean isMyType(Object item) {if (item instanceof List) {List list = (List) item;for (Object o : list) {if (o == null) {continue;}if (!(o instanceof ChannelItem)) {return false;}}return true;}return false;}@Overridepublic int getLayoutId() {return R.layout.layout_channel;}protected PageGridView pageGridView;ChannelPageIndicator channelPageIndicator;ChannelAdapter adapter;List<ChannelItem> channels = new ArrayList<>();@Overridepublic void updateView(Context context, Object item) {List<ChannelItem> channels = (List<ChannelItem>) item;this.channels.clear();this.channels.addAll(channels);if (adapter == null) {adapter = new ChannelAdapter(context, this.channels, getColums());pageGridView.setAdapter(adapter);pageGridView.setPageIndicator(channelPageIndicator);pageGridView.setOnItemClickListener(new PageGridView.OnItemClickListener() {@Overridepublic void onItemClick(PageGridView pageGridView, int position) {Click(ChannelViewHolder.(position));}});} else {ifyDataSetChanged();}}protected int getColums() {return 4;}
}
最后讲我们的这些信息记录到配置文件中
需要说明的是jsonLocation,它的值是
//{表示解析一个对象,[代表解析一个数据,后面是数据的名字
//而[name:0 代表解析一个名叫name的json数据下面的第一个元素
{response[centers
我们来看看解析过程
如果不想被自动填充为List则在配置文件中设置如下属性
打开断点看看数据解析出来的样子
更多细节大家看Demo吧
覆盖SmartListFragment的这个方法可以替换自己的数据解析器
前提实现这个接口
目前有一个默认的实现
h.smartlibrary.impl;t.Context;h.smartlibrary.NetRequest;
h.smartlibrary.NetRequestHandler;
h.smartlibrary.util.FileUtil;
import com.zhy.http.okhttp.OkHttpUtils;
import com.zhy.http.okhttp.builder.GetBuilder;
import com.zhy.http.okhttp.builder.HasParamsable;
import com.zhy.http.okhttp.builder.OkHttpRequestBuilder;
import com.zhy.http.okhttp.builder.PostFormBuilder;
import com.zhy.http.okhttp.callback.StringCallback;import java.util.Map;import okhttp3.Call;/*** Created by zhuguohui on 2016/9/6.*/
public class SmartNetRequestHandler implements NetRequestHandler {private final Context mContext;private String HTTP_HEAD = "http";private String HTTPS_HEAD = "https";private String RAW_HEAD="raw://";public SmartNetRequestHandler(Context context){mContext=context;}@Overridepublic void handleNetRequest(final NetRequest netRequest) {String url = Url();boolean isHttpRequest = false;if (url != null && url.length() > 5) {if (LowerCase().startsWith(HTTP_HEAD) || LowerCase().startsWith(HTTPS_HEAD)) {isHttpRequest = true;}}Method()==null){netRequest.setMethod(NetRequest.METHOD.GET);}if (isHttpRequest) {GetBuilder getBuilder = null;PostFormBuilder postFormBuilder = null;OkHttpRequestBuilder requestBuilder;HasParamsable hasParamsable;switch (Method()) {case GET:getBuilder = ();break;case POST:postFormBuilder = OkHttpUtils.post();break;}requestBuilder = getBuilder != null ? getBuilder : postFormBuilder;if (requestBuilder == null) {onError(netRequest, "不支持的协议!");return;}hasParamsable = getBuilder != null ? getBuilder : postFormBuilder;requestBuilder.url(url);Map<String, String> params = Params();if (params != null && params.size() > 0) {for (String key : params.keySet()) {hasParamsable.addParams(key, (key));}}requestBuilder.build().execute(new StringCallback() {@Overridepublic void onError(Call call, Exception e, int id) {Error(netRequest, e.getMessage());}@Overridepublic void onResponse(String response, int id) {onSuccess(netRequest,response);}});} else {LowerCase().startsWith(RAW_HEAD)){String rawName = url.substring(RAW_HEAD.length());String s = adRaw(mContext, rawName);onSuccess(netRequest, s);}else{onError(netRequest,"不支持的协议!");return;}}}public void onError(NetRequest request, String msg) {if (request != null && ResultListener() != null) {ResultListener().onError(msg);}}public void onSuccess(NetRequest request, Object data) {if (request != null && ResultListener() != null) {request.setData(data);ResultListener().onSuccess(request);}}@Overridepublic void cancelNetRequest(NetRequest netRequest) {}
}
覆盖这个方法
protected ListViewUpdateManger getUpdateManager(Context context){return new PullToRefreshManger(context);}
实现这个接口
/*** 管理listview的上拉加载与下拉刷新* Created by zhuguohui on 2016/9/5.*/
public interface ListViewUpdateManger {ListView getListView();View getView();void setState(IPagePolicy.PageState state);void setAdapter(BaseAdapter adapter);void setUpdateListener(UpdateListener listener);interface UpdateListener {void pullUp();void pullDown();}void updateComplete();void update(boolean showAnimation);}
有一个默认的实现PullToRefreshManger大家可以看看源码
比如添加统一的token之类的
1.代码部分
2.布局部分
看这里关于新闻类应用快速开发框架的思考
SmartDemo
本文发布于:2024-02-02 13:00:06,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170685000843964.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |