当前位置: 首页 > news >正文

自建设网站有没有便宜的网站建设

自建设网站,有没有便宜的网站建设,韩国跨境电商有哪些平台,网页加速器手机在平常的开发中经常会有很多列表页面#xff0c;每做一个列表页就需要创建这个布局文件那个Adapter适配器文件等等一大堆与之相关的附属的不必要的冗余文件。如果版本更新迭代比较频繁#xff0c;如此以往#xff0c;就会使项目工程变得无比庞大臃肿。 如果看过这篇文章或者…在平常的开发中经常会有很多列表页面每做一个列表页就需要创建这个布局文件那个Adapter适配器文件等等一大堆与之相关的附属的不必要的冗余文件。如果版本更新迭代比较频繁如此以往就会使项目工程变得无比庞大臃肿。 如果看过这篇文章或者在使用过这种方式之后呢所有的工作都可以被压缩成只有两个文件一个JAVA文件一个XML布局文件。而且代码还少少的。 咱们来看看实际情况 平常的一个列表页面的生成需要以下文件 一个Activity文件有时候可能还会忘记注册一个包含上下拉刷新控件以及无数据时提示的布局文件一个Listview的item的布局文件一个Adapter适配器文件一个需要被解析的Bean文件 当然在Activity中还需要处理以下功能数据解析分页加载数据缓存网络请求 当然以上功能可以通过频繁的复制粘贴来实现但是这会给以后的维护留下不少不小的坑比如突然需要更换Listview为Recyclerview你是不是顿时就想哭了呢是不是就得一个个文件去改呢现在不用了改俩地方就行了。 现在你可能想知道一个公共的List页有什么特点呢无需再关心网络请求、数据解析、分页、缓存等相同的功能不需要写那么多的相同的布局文件只用写那些不同的item布局文件就可以只需要关心你关心的只会有一个Adapter适配器一个ViewHolder存在Activity也可以只有一个可复用性超强无论是Activity中展示还是在被要求放在ViewPager中显示都没问题大大减小项目的工程文件数量提高编译速度不用再把一天的时间都浪费在编译时间上提高你的工作效率不用再复制粘贴那个时间没有这个快只用实现你的getView方法就可以减少维护成本如果某一天需要在网络请求加上某个参数以前的方法需要改无数个地方而现在只用改一个地方就OK如果如探需要更改上下拉刷新控件比如需要将XListView改成PullToRefreshListView你是不是就苦逼了很多地方都需要跟着改现在不用了只用动一个地方全都OK还有很多我一时间想不起来等你去发掘的功能 好BB了这么多到底是怎么实现和怎么使用呢容我慢慢道来好先来看看使用起来有多便捷/*** 示例代码将关键的部分放在fragment中无论是viewpager还是Activity还是其它容器都可以将fragment嵌入其中显示* * author Sahadev**/ public class ExampleFragment extends SuperAbstListFragmentExampleBean {public static AbstListFragment getInstance(String requestUrl) {AbstListFragment fragment new ExampleFragment();Bundle bundle new Bundle();bundle.putString(AbstListFragment.URL, requestUrl);fragment.setArguments(bundle);return fragment;}Overridepublic Type getInstanceType() {// 返回需要实例化的对象类型return new TypeTokenListExampleBean() {}.getType();}/*** 需要实例化的类,这里仅用一个属性做例子* * author Work**/public static class ExampleBean implements Serializable {/*** */private static final long serialVersionUID 7624541082621792974L;SerializedName(title)public String title;}//在这里完成数据绑定就可以了支持链式调用Overridepublic void setView(ViewHolder viewHolder, ExampleBean t) {viewHolder.setText(R.id.title, t.title);}Overridepublic void onItemClick(AdapterView? parent, View view, int position, long id) {} } 这是实际运行效果图:仅仅通过短短的几行代码就可以实现强大的功能是不是很方便 好效果先看到了接下来描述一下是如何完成这么多功能的当然子类写的代码少那说明父类已经帮它完成了不少功能所以咱们先看看整体的目录结构这个图可能画的有些毛糙还是再用小文来简述一下BaseFragment含有一些基本的功能比如快速弹出一个toast显示一个等待对话框等待它还有子类常用的一些属性activityLayoutInflaterImageLoader 等等/*** 基本类提供一些常用的基本的方法属性供子类使用* * author Sahadev**/ public class BaseFragment extends Fragment {/*** 图片加载工具*/protected ImageLoader mImageLoader;/*** 等待对话框*/private LoadingDialog mLoadingDialog;/*** 布局填充器*/protected LayoutInflater mInflater;/*** context*/protected Activity mContext;Overridepublic void onAttach(Activity activity) {super.onAttach(activity);mContext activity;mInflater (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);}Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);// 在此处初始化mImageLoadermLoadingDialog等属性mLoadingDialog LoadingDialog.getInstance(mContext);// imageLoader属性可在自定义的Application中设置全局的单例由自定义Application暴露接口获取单例,比如// mImageLoader CustomApplication.getImageLoaderInstance();}/*** 吐司* * param message*/protected void toast(String message) {Toast.makeText(mContext, message, Toast.LENGTH_SHORT).show();}/*** 显示等待对话框显示默认文本*/protected void showLoadingDialog() {if (mLoadingDialog ! null) {mLoadingDialog.show();}}/*** 显示等待对话框显示传入的文本* * param message*/public void showLoadingDialog(String message) {if (mLoadingDialog ! null) {mLoadingDialog.setMessage(message);mLoadingDialog.show();}}/*** 关闭等待对话框*/protected void dismissLoadingDialog() {if (mLoadingDialog ! null) {mLoadingDialog.dismiss();}}Overridepublic void onDestroy() {super.onDestroy();dismissLoadingDialog();}} AbstListFragment则是咱们项目的关键部分了它集成了界面生成、空数据展示界面、网络请求及分页请求网络请求回调item点击回调界面主动刷新广播接收器等功能可以使用户自己定义适配器/*** 含有ListView的Fragment* 抽取公共的含有ListView的Fragment此Fragment已经包括基本的下拉刷新网络加载分页加载等公共功能只需要关心实现 推荐使用* {link #SuperAbstListFragment}实例化子类方式参见{link #ExampleFragment}* * author Sahadev* */ public abstract class AbstListFragment extends BaseFragment implements OnItemClickListener, OnClickListener,ListenerJSONObject, ErrorListener, OnRefreshListener2ListView {protected PullToRefreshListView mListView;protected ImageView emptyView;private AnimationDrawable rocketAnimation;private View rootView;protected int page 0;public static final String URL ABST_LIST_FRAGMENT_URL;public static final String NEED_REFRESH_BROADCAST_RECEIVER NEED_REFRESH_BROADCAST_RECEIVER;/*** 请求的链接地址*/protected String requestUrl;/*** 由子类实现安全传参* * param requestUrl* return*/public static AbstListFragment getInstance(String requestUrl) {return null;}Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {if (rootView null) {rootView inflater.inflate(R.layout.activity_list_layout, container, false);emptyView (ImageView) rootView.findViewById(R.id.empty_view);mListView (PullToRefreshListView) rootView.findViewById(R.id.list);mListView.setEmptyView(emptyView);mListView.getRefreshableView().setLayoutTransition(new LayoutTransition());mListView.setOnRefreshListener(this);mListView.setOnItemClickListener(this);mListView.getRefreshableView().setOnItemClickListener(this);emptyView.setOnClickListener(this);Bundle bundle getArguments();if (bundle ! null) {requestUrl getArguments().getString(AbstListFragment.URL);}}ViewGroup parent (ViewGroup) rootView.getParent();if (parent ! null) {parent.removeView(rootView);}return rootView;}Overridepublic void onStart() {super.onStart();if (mListView ! null) {mListView.setRefreshing(false);}}Overridepublic void onPullDownToRefresh(PullToRefreshBaseListView refreshView) {page 0;getData(requestUrl p page);// 这里可以添加分页和其它请求服务器所需要的必要参数比如token或者其它什么的所以在传入的地方只用传入必要的参数就OK}Overridepublic void onPullUpToRefresh(PullToRefreshBaseListView refreshView) {page;getData(requestUrl p page);}protected void getData(String requestUrl) {if (isNeedLoadDataFromNet()) {if (page 0) {// 可以在这里设置加载动画emptyView.setImageResource(R.drawable.loading_animation);// R.drawable.loading_animation代表动画资源rocketAnimation (AnimationDrawable) emptyView.getDrawable();rocketAnimation.start();}RequestUtils.requesGet(requestUrl, this, this);}}/*** 这个方法用于返回是否是从网络加载有些数据是需要从本地加载的这个 方法就可以由子类来控制具体是什么* * return*/protected boolean isNeedLoadDataFromNet() {return true;}Overridepublic void onResponse(JSONObject response) {// 设置请求完毕之后的状态rocketAnimation.stop();emptyView.setImageResource(R.drawable.nocontent);mListView.onRefreshComplete();}Overridepublic void onErrorResponse(VolleyError error) {// 设置请求完毕之后的状态rocketAnimation.stop();emptyView.setImageResource(R.drawable.nocontent);toast(咦?网络状况貌似出了点问题.);mListView.onRefreshComplete();}Overridepublic void onClick(View v) {switch (v.getId()) {// 当点击无数据提示的时候重新加载case R.id.empty_view:mListView.setRefreshing();break;default:break;}}private BroadcastReceiver receiver;Overridepublic void onResume() {super.onResume();receiver new NeedRefreshBroadcastReceiver();IntentFilter filter new IntentFilter(NEED_REFRESH_BROADCAST_RECEIVER);filter.addCategory(Intent.CATEGORY_DEFAULT);mContext.registerReceiver(receiver, filter);}Overridepublic void onPause() {super.onPause();mContext.unregisterReceiver(receiver);}/*** 主动刷新广播接收器当数据发生改变的时候(比如添加或者删除)主动刷新* * author Work**/private class NeedRefreshBroadcastReceiver extends BroadcastReceiver {Overridepublic void onReceive(Context context, Intent intent) {mListView.setCurrentMode(Mode.PULL_FROM_START);mListView.setRefreshing(false);}}}SuperAbstListFragmentT 是对父类AbstListFragment的进一步抽象它里面集成了一个适配器与一个万能的ViewHolder使子类只用实现几个基本的方法就可以比如要解析的类型、当item点击之后的处理方式、数据与界面如何绑定等等来看看这个类都有什么/*** 抽象的AbstListFragment中间层具有更强大的功能* * author Work**/ public abstract class SuperAbstListFragmentT extends AbstListFragment {protected AbstBaseAdapterT adapter;Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);try {// 如果有些Adapter中不满足实际情况的话可以使用反射来实例化// adapter (AbstBaseAdapterT)// getAdapterClass().getConstructor(Context.class).newInstance(mContext);adapter new SuperAdapter(mContext);mListView.setAdapter(adapter);} catch (IllegalArgumentException e) {e.printStackTrace();}}/*** 万能适配器它只是个中间件* * author Work**/public class SuperAdapter extends AbstBaseAdapterT {public SuperAdapter(Context context) {super(context);}Overridepublic View getView(int position, View convertView, ViewGroup parent) {return SuperAbstListFragment.this.getView(position, convertView, parent);}}/*** * * param position* param convertView* param parent* return*/public View getView(int position, View convertView, ViewGroup parent) {// 这里使用的是万能的ViewHolderViewHolder viewHolder ViewHolder.get(mContext, convertView, parent, R.layout.fragment_list_item, position);// 这一行可以进一步的抽取到父类中T t adapter.getData().get(position);setView(viewHolder, t);return viewHolder.getConvertView();}/*** 绑定数据使用户真正关心的只有他们想要关心的* * param viewHolder* param t*/public abstract void setView(ViewHolder viewHolder, T t);/*** 如果单单的getView方法不满足需求的话可以通过自定义Adapter的方法来实现该方法用来返回需要实例化的Adapter的类名* * return*/public Class? getAdapterClass() {return null;}/*** 需要解析的数据类型是一个对象还是对象的集合由这个返回* * return*/public abstract Type getInstanceType();/** (non-Javadoc)* * see* com.sahadev.general_assembly.base.AbstListFragment#onResponse(org.json* .JSONObject) 当网络请求成功之后回调该方法开始解析数据*/Overridepublic void onResponse(JSONObject response) {super.onResponse(response);if (response ! null response.optBoolean(success)) {Gson gson new Gson();ListT datas gson.fromJson(response.optJSONArray(data).toString(), getInstanceType());initAdapter(datas);}}/*** 数据解析完毕之后刷新数据* * param list*/protected void initAdapter(ListT list) {if (page 0) {adapter.addFirstPageData(list);} else {adapter.addOtherPageData(list);}}} 通过以上几个类的不断抽取当最后在使用的时候实现类只用简单的几行代码就可以完成很多很多的功能怎么样是不是很简单接下来简单介绍一下如何在各种页面只用一个Activity来装载不同页面的Fragment呢/*** 含有ListFragment的Activity* * author 尚斌* */ public class IncludeListFragmentActivity extends FragmentActivity {private String mFragmentClass x.x.x.x.x.x;private String mRequestUrl http://www.baidu.com;private String title 标题未定义;public static final String TITLE TITLE;public static final String CLASS CLASS;public static final String URL URL;/*** param context* param fragmentClass* 需要实例化的Fragment的包名* param requestUrl* 该Fragment内部的请求地址* return*/public static Intent getIntent(Context context, String fragmentClass, String requestUrl, String title) {Intent intent new Intent(context, IncludeListFragmentActivity.class);Bundle bundle new Bundle();bundle.putString(TITLE, title);bundle.putString(CLASS, fragmentClass);bundle.putString(URL, requestUrl);intent.putExtras(bundle);return intent;}SuppressWarnings(unchecked)Overrideprotected void onCreate(Bundle savedInstanceState) {requestWindowFeature(Window.FEATURE_NO_TITLE);super.onCreate(savedInstanceState);Intent intent getIntent();Bundle bundle intent.getExtras();mFragmentClass bundle.getString(CLASS);mRequestUrl bundle.getString(URL);title bundle.getString(TITLE);// 设置标题setTitle(title);// 设置布局文件setContentView(R.layout.activity_include_list_fragment);try {ClassBaseFragment newInstance (ClassBaseFragment) Class.forName(mFragmentClass);Method method null;BaseFragment fragment null;method newInstance.getMethod(getInstance, String.class);fragment (BaseFragment) method.invoke(null, mRequestUrl);if (fragment ! null) {getSupportFragmentManager().beginTransaction().add(R.id.container, fragment).commit();} else {throw new Exception(You must be have a named getInstance method!);}} catch (Exception e) {e.printStackTrace();}} 就是这个文件可以通过传入的标题需要实现的Fragment类需要请求的地址来生成多种多样的界面所以在实现子类的时候每个子类都需要重写public static AbstListFragment getInstance(String requestUrl) 方法以供外部可以调用到它。说了这么多在这里面其实是没有缓存的其实这个公共的项目与缓存关系是不大的既然提到就说一下是怎么实现的在项目开发的时候很多时候都用到了第三方网络框架也是有源码的这里就用Volley举个栗子在Volley请求的时候在请求的基类方法中根据请求的URL去数据库中寻找数据库这里推荐使用xUtils提供的数据库存储如果没找到则调用网络请求在网络请求成功回调的部分将请求的数据存入数据库以便第二次查找基本思路就是这样使用代码举例网络请求部分public JsonRequest(int method, String url, MapString, String body, ListenerT listener,ErrorListener errorListener, boolean isNeedCache, Type type) {super(method, url tokentoken vidvid), errorListener);mListener listener;mRequestBody null;mType type;if (isNeedCache !(检查网络是否可用)) {url tokentoken vidvid;try {//使用自定义的方式去数据库中查找这里使用的是xUtils举例ListCache datas xUtils.getInstance().getDbUtils().findAll(Selector.from(Cache.class).where(requestUrl, , url).orderBy(time, false).limit(1));if (!netAccessed datas ! null listener ! null) {for (Cache cache : datas) {//如果查找成功就进行回调listener.onResponse((T) new JSONObject(cache.jsonString));}}} catch (DbException e) {e.printStackTrace();} catch (JSONException e) {e.printStackTrace();}}bodyMap body;}网络回调部分将服务器数据存储Overrideprotected void deliverResponse(final T response) {if (response ! null (response.getClass().equals(String.class) || response.getClass().equals(JSONObject.class))) {new Thread(new Runnable() {Overridepublic void run() {Cache cache new Cache(mUrl, response.toString());try {//使用xUtils进行存储xUtils.getInstance().getDbUtils().save(cache);} catch (DbException e) {e.printStackTrace();}}}).start();}netAccessed true;if (mListener ! null (如果网络可用)) {if (mType ! null) {try {String simString1 response.getClass().getName();String simString2 mType.toString();//有多种类型回调如果只是回调String类则调用以下if (simString2.contains(simString1)) {mListener.onResponse(response);} else {mListener.onResponse(null);}} catch (Exception e1) {}} else {//还有一种是JsonObject类型则调用以下mListener.onResponse(response);}}}大伙可能实际情况不是这个样子但是思路可能差不多仅供参考。 当然在该项目中还集成了不少别的基本的东西比如ImageLoader图片加载Volley请求工具json解析工具等如果是作为一个新项目的话本项目还是可以作为一个最基本的起始项目来用用。项目地址在这里https://git.oschina.net/sahadev/General-Assembly项目是一个开源项目迫切的想要更多的人可以加入进来将自己工作中可以提高工作效率的知识和成果分享出来出一份力。如果想加入 请联系我sahadevfoxmail.com希望可以一起发展壮大拥有很多为大家减轻负担的成果。
http://www.yutouwan.com/news/225200/

相关文章:

  • 广西建设教育学会网站选手机网站
  • wordpress设置为繁体字网站seo诊断
  • 大连网站建设功能做网站和app
  • roseonly企业网站优化网络销售网站外包
  • 波莱网站开发网站开发相关期刊
  • 信息手机网站模板下载安装eclipse 网站开发
  • 济南外贸网站建设山西网站建设
  • 有做阿里网站的吗太原app开发公司
  • 云主机搭建asp网站网站集约化
  • 花都商城网站建设php做网站后台有哪些框架
  • 苏州seo建站公司网站建设维护的岗位
  • 龙岩网站设计较好的公司医疗室内设计网站推荐
  • 公司怎么建设网站首页wordpress的优势和
  • 要想浏览国外网站 应该怎么做youku网站开发技术
  • 做网站前端开发的必备软件杨青个人博客wordpress
  • 模板网站和定制网站有什么区别小程序商城页面设计模板
  • wordpress 故障宕机做竞价的网站有利于优化吗
  • 陕西网站建设宣传方案便捷的网站建设
  • 渭南网站建设价格wordpress 博客 安装
  • 厦门营销网站建设公司佛山百度快照优化排名
  • 做暧免费观看网站网站分析数据
  • 中小企业为什么要建网站有网站做淘宝客
  • 网站建设总结 优帮云布吉网站的建设
  • html网站发布苏州市规划建设局网站
  • 做物流网站的公司设计欣赏心得体会
  • 动易网站后台管理功能国家企业信息网官网
  • 一个网站数据库百度站长平台验证网站
  • 网站上如何做天气插件做网站那个服务器好
  • 深圳网站建设外包公司排名天津有哪些有名的网站建设公司
  • 企业网站代码免费个人网站怎么制作