95秀-PullToRefreshListView 示例
正在加载、暂无数据页面
public class RefreshGuideTool {
private RelativeLayout rl_loading_guide;//整个Viewprivate LinearLayout ll_loading_guide_parent;//无数据时显示的布局private TextView tv_loading_guide;//什么都没有,下拉刷新private RelativeLayout mPgLoaing;//正在加载时显示的布局public RefreshGuideTool(View v) {rl_loading_guide = (RelativeLayout) v.findViewById(R.id.rl_loading_guide);ll_loading_guide_parent = (LinearLayout) v.findViewById(R.id.ll_show_img);tv_loading_guide = (TextView) v.findViewById(R.id.tv_loading_guide);mPgLoaing = (RelativeLayout) v.findViewById(R.id.pg_loading);ll_loading_guide_parent.setVisibility(View.GONE);mPgLoaing.setVisibility(View.VISIBLE);}public RefreshGuideTool(Activity activity) {rl_loading_guide = (RelativeLayout) activity.findViewById(R.id.rl_loading_guide);ll_loading_guide_parent = (LinearLayout) activity.findViewById(R.id.ll_show_img);tv_loading_guide = (TextView) activity.findViewById(R.id.tv_loading_guide);mPgLoaing = (RelativeLayout) activity.findViewById(R.id.pg_loading);ll_loading_guide_parent.setVisibility(View.GONE);mPgLoaing.setVisibility(View.VISIBLE);}public TextView getTvLoadingGuide() {return tv_loading_guide;}public void isShow(boolean isShow) {//设置是否显示“暂无数据”页面mPgLoaing.setVisibility(View.GONE);if (isShow) {rl_loading_guide.setVisibility(View.VISIBLE);ll_loading_guide_parent.setVisibility(View.VISIBLE);} else {rl_loading_guide.setVisibility(View.GONE);ll_loading_guide_parent.setVisibility(View.GONE);}}public void showProgressBar() {//显示“正在加载”页面rl_loading_guide.setVisibility(View.VISIBLE);ll_loading_guide_parent.setVisibility(View.GONE);mPgLoaing.setVisibility(View.VISIBLE);}}
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/rl_loading_guide"android:layout_width="match_parent"android:layout_height="match_parent" ><LinearLayoutandroid:id="@+id/ll_show_img"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:layout_marginTop="60dp"android:orientation="vertical"android:visibility="gone" ><ImageViewandroid:id="@+id/iv_loading_guide"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:src="@drawable/pic_refresh_load_defalut" /><TextViewandroid:id="@+id/tv_loading_guide"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:clickable="true"android:gravity="center"android:paddingTop="4dp"android:src="@drawable/pic_refresh_load_defalut"android:text="暂无数据"android:textColor="@color/normal_line_color"android:textSize="15sp" /></LinearLayout><RelativeLayoutandroid:id="@+id/pg_loading"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true" ><ProgressBarandroid:id="@+id/pgs_default_loading"android:layout_width="@dimen/live_room_progress"android:layout_height="@dimen/live_room_progress"android:layout_centerInParent="true"android:indeterminate="true"android:indeterminateDrawable="@drawable/progressbar_video_drawable" /><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:src="@drawable/ic_default_loding_bg" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/pgs_default_loading"android:layout_centerHorizontal="true"android:layout_gravity="center"android:layout_marginTop="30dp"android:gravity="center"android:src="@drawable/pic_refresh_load_defalut"android:text="正在加载..."android:textColor="@color/main_color"android:textSize="15sp" /></RelativeLayout></RelativeLayout>
抽出的Activity父类
public abstract class BaseListPullRefreshActivity<T> extends BaseActivity implements OnRefreshListener2<ListView>, INetworkStateCallback {
protected PullToRefreshListView mPullToRefreshListView;//listview能用的属性PullToRefreshListView也都能用protected RefreshGuideTool mRefreshGuideTool; //用于加载数据提醒(正在加载,暂无数据)protected List<T> mDatas;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}protected void init() {// 此方法一定要主动在oncreat中调用(代码封装的不合理)NetReceiver.register(this);mDatas = new ArrayList<T>();initView();asyncDownLoadData();}@Overridepublic void onDestroy() {NetReceiver.unRegister(this);super.onDestroy();}@Overridepublic void onNetworkAvailable() {asyncDownLoadData();}@Overridepublic void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) {asyncDownLoadData();}@Overridepublic void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) {asyncUpLoadData();}public PullToRefreshListView getPullToRefreshScorllView() {return mPullToRefreshListView;}public void setPullToRefreshScorllView(PullToRefreshListView mPullToRefreshListView) {this.mPullToRefreshListView = mPullToRefreshListView;}public List<T> getDatas() {return mDatas;}public void setDatas(List<T> mDatas) {this.mDatas = mDatas;}/*** 检查是否需要显示或隐藏刷新提示界面(没有数据时显示“暂无数据”)*/protected void checkShowRefreshGuide(List<T> datas) {if (mRefreshGuideTool != null) {if (datas != null && datas.size() > 0) {mRefreshGuideTool.isShow(false);} else {mRefreshGuideTool.isShow(true);}}}/*** 异步加载数据*/protected abstract void asyncDownLoadData();/*** 异步加载数据*/protected abstract void asyncUpLoadData();/*** 初始化views*/protected abstract void initView();}
Activity
public class FamilyApplyManageActivity extends BaseListPullRefreshActivity<BaseUserBean> implements OnClickListener, ManageOnClick {
private FamilyApplyManageAdapter mAdapter;private int pageIndex = 1;// 请求页码private ImageView iv_clear;private PopupWindow mPopupWindow;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);pageName = "申请管理";init();}@Overrideprotected void initView() {setContentView(R.layout.activity_family_apply);TitleBar mTitleBar = new TitleBar(this);mTitleBar.setViewText("帮会详情", "申请信息");iv_clear = (ImageView) findViewById(R.id.iv_clear);iv_clear.setOnClickListener(this);mPullToRefreshListView = (PullToRefreshListView) findViewById(R.id.lv_apply);mPullToRefreshListView.setOnRefreshListener(this);mPullToRefreshListView.setMode(Mode.BOTH);mAdapter = new FamilyApplyManageAdapter(this, mDatas);mAdapter.setManageOnClickListener(this);mPullToRefreshListView.setAdapter(mAdapter);mRefreshGuideTool = new RefreshGuideTool(this);mPullToRefreshListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {try {//跳转到申请者的档案页面AppUtil.goToUser(FamilyApplyManageActivity.this,mDatas.get(position - mPullToRefreshListView.getRefreshableView().getHeaderViewsCount()).anchorId);} catch (Exception e) {}}});}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.iv_clear:popClearView(iv_clear);break;case R.id.fl_clear_menu: //清理showConfirmDialog();break;default:break;}}/*** 弹出清空申请记录窗口*/private void popClearView(View view) {View pop_layout = LayoutInflater.from(this).inflate(R.layout.item_famil_apply_pop, null);FrameLayout fl_clear_menu = (FrameLayout) pop_layout.findViewById(R.id.fl_clear_menu);fl_clear_menu.setOnClickListener(this);mPopupWindow = new PopupWindow(pop_layout, LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);mPopupWindow.setContentView(pop_layout);mPopupWindow.setFocusable(true);mPopupWindow.setOutsideTouchable(true);mPopupWindow.setBackgroundDrawable(new ColorDrawable(0x00000000));mPopupWindow.getContentView().setClickable(true);mPopupWindow.getContentView().setOnKeyListener(new OnKeyListener() {@Overridepublic boolean onKey(View v, int keyCode, KeyEvent event) {if ((keyCode == KeyEvent.KEYCODE_BACK) && mPopupWindow != null && mPopupWindow.isShowing()) {mPopupWindow.dismiss();return true;}return false;}});mPopupWindow.showAsDropDown(view, 0, ApplicationUtil.dip2px(6));}/*** 弹出确认清空申请记录对话框*/private void showConfirmDialog() {ConfirmDialog mConfirmDialog = new ConfirmDialog(FamilyApplyManageActivity.this) {@Overridepublic void onCancleClick(View v) {dismiss();if (mPopupWindow != null && mPopupWindow.isShowing()) {mPopupWindow.dismiss();}}@Overridepublic void onConfirmClick(View v) {ansyClearApplyInfor();dismiss();}};mConfirmDialog.getContentTextView().setText("确认清空申请记录?");mConfirmDialog.show();}/*** 管理员点击“清空申请记录”后访问服务器*/private void ansyClearApplyInfor() {RequestParams params = new RequestParams();params.put("uid", AppUser.getInstance().getUser().getuId());params.put("session_id", AppUser.getInstance().getUser().getuSessionId());params.put("family_id", AppUser.getInstance().getUser().getUserFamily().getId());//申请加入的帮会idAsyncXiuHttpHelper.post(Constants.GROUP_APPLY_CLEAN, params, new OnHttpListener<JSONObject>() {@Overridepublic void onHttpListener(boolean httpSuccessed, JSONObject obj) {Log.i("-bqt", "=====点击清空申请记录后返回的数据:" + obj.toString());if (httpSuccessed) {if (obj.optInt("result", -1) == 1) {ApplicationUtil.showToast(FamilyApplyManageActivity.this, "清理成功");mDatas.clear();mAdapter.notifyDataSetChanged();checkShowRefreshGuide(mDatas);} else {ApplicationUtil.showToast(FamilyApplyManageActivity.this, obj.optString("msg", "清理失败"));}} else {ApplicationUtil.showToast(FamilyApplyManageActivity.this, "网络错误");}if (mPopupWindow != null && mPopupWindow.isShowing()) {mPopupWindow.dismiss();}}});}/*** 获取申请加入帮会信息* @param isDownload true:下拉刷新; false:加载更多*/private void ansyApplyInfor(boolean isDownload) {if (isDownload) {pageIndex = 1;}RequestParams params = new RequestParams();params.put("uid", AppUser.getInstance().getUser().getuId());params.put("session_id", AppUser.getInstance().getUser().getuSessionId());params.put("family_id", AppUser.getInstance().getUser().getUserFamily().getId());params.put("page_index", pageIndex + "");//页码AsyncXiuHttpHelper.post(Constants.GROUP_APPLY_LIST, params, new OnHttpListener<JSONObject>() {@Overridepublic void onHttpListener(boolean httpSuccessed, JSONObject obj) {Log.i("-bqt", "申请加入帮会列表返回数据:" + obj.toString());if (httpSuccessed) {if (obj.optInt("result", -1) == 1) {JSONArray jsonArray = obj.optJSONArray("family_join_list");if (jsonArray != null && jsonArray.length() != 0) {if (pageIndex == 1)mDatas.clear();for (int i = 0; i < jsonArray.length(); i++) {BaseUserBean bean = new BaseUserBean(jsonArray.optJSONObject(i));mDatas.add(bean);}}pageIndex++;} else {ApplicationUtil.showToast(FamilyApplyManageActivity.this, "数据获取失败");}} else {ApplicationUtil.showToast(FamilyApplyManageActivity.this, "网络错误");}mPullToRefreshListView.onRefreshComplete();mAdapter.notifyDataSetChanged();checkShowRefreshGuide(mDatas);}});}/*** 管理员点击同意或拒绝后访问服务器。这是回调方法中调用的方法,其实可以直接将他设为回调方法的。* @param state 1 同意 ; 2 拒绝*/private void ansyApplyManage(final int state, final BaseUserBean bean) {RequestParams params = new RequestParams();params.put("uid", AppUser.getInstance().getUser().getuId());params.put("session_id", AppUser.getInstance().getUser().getuSessionId());params.put("family_id", AppUser.getInstance().getUser().getUserFamily().getId());//申请加入[帮会]的idparams.put("fm_uid", bean.anchorId + "");//申请加入帮会[用户]的idparams.put("status", state + "");AsyncXiuHttpHelper.post(Constants.GROUP_APPLY_DEAL, params, new OnHttpListener<JSONObject>() {@Overridepublic void onHttpListener(boolean httpSuccessed, JSONObject obj) {Log.i("-bqt", "=====点击同意或拒绝后返回的数据:" + obj.toString());if (httpSuccessed) {if (obj.optInt("result", -1) == 1) {if (mDatas != null)mDatas.remove(bean);if (mAdapter != null)mAdapter.notifyDataSetChanged();checkShowRefreshGuide(mDatas);if (state == 1) {ApplicationUtil.showToast(FamilyApplyManageActivity.this, "已同意");} else {ApplicationUtil.showToast(FamilyApplyManageActivity.this, "已拒绝");}} else {ApplicationUtil.showToast(FamilyApplyManageActivity.this, obj.optString("msg", "操作失败"));}} else {ApplicationUtil.showToast(FamilyApplyManageActivity.this, R.string.unknow_err);}}});}@Overrideprotected void asyncDownLoadData() {//下拉刷新ansyApplyInfor(true);}@Overrideprotected void asyncUpLoadData() {//加载更多ansyApplyInfor(false);}@Overrideprotected void checkShowRefreshGuide(List<BaseUserBean> datas) {super.checkShowRefreshGuide(datas);if (mDatas != null && mDatas.size() > 0) {iv_clear.setVisibility(View.VISIBLE);} else {iv_clear.setVisibility(View.INVISIBLE);}}@Overridepublic void onManageClick(int type, BaseUserBean bean) {if (bean != null) {ansyApplyManage(type, bean);}}}
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/white" ><includeandroid:id="@+id/title_bar"android:layout_width="match_parent"android:layout_height="@dimen/title_bar_height"layout="@layout/view_top_bar2" /><com.handmark.pulltorefresh.library.PullToRefreshListViewxmlns:ptr="http://schemas.android.com/apk/res-auto"android:id="@+id/lv_apply"android:layout_width="match_parent"android:layout_height="fill_parent"android:layout_below="@id/title_bar"android:descendantFocusability="afterDescendants"android:divider="@color/line_divider"android:dividerHeight="0.1dp"android:footerDividersEnabled="true"android:listSelector="@android:color/transparent"android:scrollbarThumbVertical="@drawable/scrollbar"ptr:ptrAnimationStyle="rotate"ptr:ptrDrawableEnd="@drawable/default_ptr_flip_bottom"ptr:ptrDrawableStart="@drawable/default_ptr_flip_bottom"ptr:ptrHeaderTextColor="@color/light_gray" /><ImageViewandroid:id="@+id/iv_clear"android:layout_width="wrap_content"android:layout_height="48dp"android:layout_alignParentRight="true"android:layout_alignParentTop="true"android:layout_centerVertical="true"android:src="@drawable/family_more_selector"android:visibility="gone" /><includeandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_below="@id/title_bar"layout="@layout/item_loading_error_layout" /></RelativeLayout>
adapter
public class FamilyApplyManageAdapter extends BaseAdapter implements OnClickListener{
private Activity mActivity;private List<BaseUserBean> mList;private ViewHolder mViewHolder;private ManageOnClick manageOnClickListener;/*** 管理申请加入帮会的适配器*/public FamilyApplyManageAdapter(Activity activity, List<BaseUserBean> list) {mActivity = activity;mList = list;}public void setManageOnClickListener(ManageOnClick manageOnClickListener) {this.manageOnClickListener = manageOnClickListener;}@Overridepublic int getCount() {return mList == null ? 0 : mList.size();}@Overridepublic Object getItem(int position) {return mList == null ? null : mList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(final int position, View convertView, ViewGroup parent) {if (convertView == null || convertView.getTag() == null) {convertView = View.inflate(mActivity, R.layout.item_family_apply_layout, null);mViewHolder = new ViewHolder();mViewHolder.iv_head = (ImageView) convertView.findViewById(R.id.iv_head);mViewHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);mViewHolder.tv_agree = (TextView) convertView.findViewById(R.id.tv_agree);mViewHolder.tv_disagree = (TextView) convertView.findViewById(R.id.tv_disagree);convertView.setTag(mViewHolder);} else {mViewHolder = (ViewHolder) convertView.getTag();}BaseUserBean bean = mList.get(position);if (bean != null) {mViewHolder.tv_name.setText(bean.anr_nick_name);//昵称ImageHelper.loadImage(bean.anr_imageUrl, mViewHolder.iv_head, R.drawable.img_user_icon);mViewHolder.tv_agree.setTag(bean);mViewHolder.tv_agree.setOnClickListener(this);mViewHolder.tv_disagree.setTag(bean);mViewHolder.tv_disagree.setOnClickListener(this);}return convertView;}public static class ViewHolder {public ImageView iv_head;// 头像public TextView tv_name;// 名字public TextView tv_agree;//同意public TextView tv_disagree;// 拒绝}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.tv_disagree:BaseUserBean baseUserBean = (BaseUserBean) v.getTag();if (baseUserBean != null) {if(manageOnClickListener != null ) manageOnClickListener.onManageClick(2, baseUserBean);}break;case R.id.tv_agree:BaseUserBean bean = (BaseUserBean) v.getTag();if (bean != null) {if(manageOnClickListener != null ) manageOnClickListener.onManageClick(1, bean);}break;default:break;}}/****************************************** interface*****************************************/public interface ManageOnClick{/*** 管理员点击同意或拒绝后回调*/void onManageClick(int type , BaseUserBean bean);}}<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/normal_item_selector_no_line"android:minHeight="88dp" ><Viewandroid:layout_width="match_parent"android:layout_height="0.1px"android:layout_marginTop="88dp"android:background="@color/line_divider" /><ImageViewandroid:id="@+id/iv_head"android:layout_width="62dp"android:layout_height="62dp"android:layout_marginTop="1dp"android:layout_centerVertical="true"android:layout_marginLeft="21dp"android:src="@drawable/img_user_icon" /><ImageViewandroid:id="@+id/iv_head_cricle"android:layout_width="64dp"android:layout_height="64dp"android:layout_centerVertical="true"android:layout_marginLeft="20dp"android:background="@drawable/bg_family_head" /><TextViewandroid:id="@+id/tv_agree"android:layout_width="44dp"android:layout_height="28dp"android:layout_alignParentRight="true"android:layout_centerVertical="true"android:layout_marginRight="20dp"android:background="@drawable/family_apply_ty_bg_selector"android:clickable="true"android:gravity="center"android:text="同意"android:textColor="@drawable/family_apply_ty_selector"android:textSize="12sp" /><TextViewandroid:id="@+id/tv_disagree"android:layout_width="44dp"android:layout_height="28dp"android:layout_centerVertical="true"android:layout_marginLeft="24dp"android:layout_marginRight="12dp"android:layout_toLeftOf="@id/tv_agree"android:background="@drawable/family_apply_jj_bg_selector"android:clickable="true"android:gravity="center"android:text="拒绝"android:textColor="@drawable/family_apply_jj_selector"android:textSize="12sp" /><TextViewandroid:id="@+id/tv_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:layout_marginLeft="12dp"android:layout_marginTop="26dp"android:layout_toLeftOf="@id/tv_disagree"android:layout_toRightOf="@id/iv_head"android:ellipsize="end"android:singleLine="true"android:text="包青天包青天,包青天"android:textColor="@color/charts_nick_name"android:textSize="13sp" /><TextViewandroid:id="@+id/tv_describing"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@id/tv_name"android:layout_marginLeft="12dp"android:layout_marginTop="8dp"android:layout_toLeftOf="@id/tv_disagree"android:layout_toRightOf="@id/iv_head"android:ellipsize="end"android:singleLine="true"android:text="请求加入帮会"android:textColor="@color/tips_custom"android:textSize="11sp" /></RelativeLayout>
95秀-PullToRefreshListView 示例的更多相关文章
- 95秀-弹窗+listview+动画 示例
Dialog布局 dialog.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLay ...
- 95秀-自定义对话框 dialog 合集
普通的确认对话框 NormalDialog.java import android.app.Dialog; import android.content.Context; import android ...
- 95秀-ViewPager 使用实例
Activity的样式 <style name="under_live_indicator" parent="android:Theme.NoTitleBa ...
- 95秀-异步http请求完整过程
最终调用时的代码 private void ansyClearApplyInfor() { RequestParams params = new RequestParams() ...
- 95秀-dialog 进度对话框 实用工具
工具Util public class DialogUtil { public static ProgressDialogView progressDialog; /** * ...
- 直播【95秀】JNI 基本实现 简洁
2017-2-8 基本架构 1.使用SurfaceView在UI层面展示视频 2.通过JNI调用C代码控制视频的播放.停止 基本功能 1.从服务器获取正在直播的主播的列表信息 2.进入直播界面 3.可 ...
- HTTP调试 抓包 工具 Fiddle 简介 示例
简介 1.常用抓包工具对比: Firebug虽然可以抓包,但是对于分析http请求的详细信息,不够强大.模拟http请求的功能也不够,且firebug常常是需要"无刷新修改",如果 ...
- MATLAB中的参数估计函数详解及调用示例【联合整理】
前言 因为最近项目上的需要,才发现MATLAB的统计工具箱中的参数估计函数,觉得很简单很好用,现在把所有的参数估计函数整理一下,并在最后面附上调用示例. 参与人员 由于时间关系,这篇随笔是两个人一起整 ...
- selenium笔记(1)
selenium笔记(1) 一.关闭页面:1.driver.close() 关闭当前页面2.driver.quit() 退出整个浏览器 二.定位元素:1.find_element_by_id: 根据i ...
随机推荐
- [javascript]event属性
1.clientX和clientY clientX和clientY是事件发生时,鼠标离浏览器可视文档区域左上角的位置 2.offsetX和offsetY offsetX和offsetY是事件发生时,鼠 ...
- Js监控回车事件
标题通俗的说,也就是绑定当用户按下回车键要执行的事件. 下面,入正题. 第一步,先编写简单的页面代码,这里我们只需要一个按钮就足够了.当然,还有按钮事件. <html> <head& ...
- getsockname和getpeername函数
这2个函数或者返回与某个套接字关联的本地协议地址(getsockname),或者返回与某个套接字关联的外地协议地址(getpeername) int getsockname(int sockfd, s ...
- SQL SERVER 数据库邮件配置
1.简单了解数据库邮件的概念和使用的传输协议及系统体系: 数据库邮件是从 SQL Server 数据库引擎中发送电子邮件的企业解决方案.通过使用数据库邮件,数据库应用程序可以向用户发送电子邮件.邮件中 ...
- UE标签排列方式
UE是一款很顺手的文件编辑软件.打开文本,都会有个标签.根据个人喜好,我喜欢标签都展开,方便快速选取指定文本. 设置如下: 高级>配置>应用程序布局>可停靠窗口>类型 ...
- Android-RecyclerView-Item点击事件设置
在上一篇博客Android-RecylerView初识中提到,RecyclerView不再负责Item视图的布局及显示,所以RecyclerView也没有为Item开放OnItemClick等点击事件 ...
- Android 仿QQ微信开场导航以及登陆界面
相信大家对于微信等社交应用的UI界面已经都很熟悉了,该UI最值得借鉴的莫过于第一次使用的时候一些列产品介绍的图片,可以左右滑动浏览,最后进入应 用,这一效果适用于多种项目中,相信今后开发应用一定会用得 ...
- Servlet&JSP中的知识点
先sun提出的是Servlet体系,这个体系使得使用JAVA的程序员也能开发基于B/S架构的WEB应用程序,使用Servlet类将HTTP请求和响应封装在标准JAVA类中来实现各种WEB应用方案.随着 ...
- RMQ——[USACO Jan07] 均衡队形题解
题目:[USACO Jan07] 均衡队形 描述: 题目描述 农夫约翰的 N (1 ≤ N ≤ 50,000) 头奶牛,每天挤奶时总会按同样的顺序站好.一日,农夫约翰决定为奶牛们举行一个“终极飞盘”比 ...
- yum puppet dashboard
该Dashboard是一种运行在Rails上的Ruby应用程序,它还不是可以添加到系统版本中的程序包,但是我们可以从Puppet Labs以RPM或者DEB包的形式获得该软件.我们也可以选择从资源进行 ...
