当前位置:  编程技术>移动开发
本页文章导读:
    ▪微信大众平台申请消息接口验证工具        微信公众平台申请消息接口验证工具 申请了一个微信公众账号,还没想好服务器端用什么技术开发。 但是发现通过验证必须要有服务器,   开箱即用: 找一台外网能访问的安装了jdk的机器.........
    ▪ listview左右拉组件        listview上下拉组件 在网上找了好多这类组件总是用得不太顺手,数据一加载多了就卡得不行,现在自己做了一个,代码基本上是最优化的,方便大家使用先看看效果吧:下面是所有代码:Andro.........
    ▪ tableview设立上下滚动高度       tableview设置上下滚动高度 可在viewDidAppear中实现加入 [tablvew setContentOffset:CGPointMake(0,480) animated:YES];  在tableView内添加一个searchbar,一起滚动;开始时隐藏headerView(即让tableView向上滚动h.........

[1]微信大众平台申请消息接口验证工具
    来源: 互联网  发布时间: 2014-02-18
微信公众平台申请消息接口验证工具

申请了一个微信公众账号,还没想好服务器端用什么技术开发。

但是发现通过验证必须要有服务器,

 

开箱即用:

找一台外网能访问的安装了jdk的机器,直接运行 java -jar weixinhelper.jar  你的token

然后再微信公众平台的 接口配置信息 中填写你的http url和token即可通过验证。

 


    
[2] listview左右拉组件
    来源: 互联网  发布时间: 2014-02-18
listview上下拉组件
在网上找了好多这类组件总是用得不太顺手,数据一加载多了就卡得不行,现在自己做了一个,代码基本上是最优化的,方便大家使用

先看看效果吧:




下面是所有代码:
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.iaiai.activity"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="8" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:label="@string/app_name"
            android:name=".ListviewTestActivity" >
            <intent-filter >
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>


main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <com.iaiai.activity.DragListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>


list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/title"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="15sp" />

</LinearLayout>


ListviewTestActivity.java
package com.iaiai.activity;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

/**
 * 
 * <br/>
 * Title: ListviewTestActivity.java<br/>
 * E-Mail: 176291935@qq.com<br/>
 * QQ: 176291935<br/>
 * Http: iaiai.iteye.com<br/>
 * Create time: 2013-8-6 下午4:50:30<br/>
 * <br/>
 * @author 丸子
 * @version 0.0.1
 */
public class ListviewTestActivity extends Activity {

	private DragListView listView;
	
	private List<String> titles = new ArrayList<String>();

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		listView = (DragListView) findViewById(R.id.listView);
		
		for(int i=0;i<30;i++){
			titles.add("标题:"+i);
		}
		
		MyAdapter adapter = new MyAdapter();
		listView.setAdapter(adapter);
		listView.setHandler(new DragListView.Handler() {
			@Override
			public void upRefresh() {
//				listView.closeHeader();
			}
			@Override
			public void downRefresh() {
//				listView.closeFooter();
			}
		});
	}
	
	public class MyAdapter extends BaseAdapter{

		@Override
		public int getCount() {
			return titles.size();
		}

		@Override
		public String getItem(int position) {
			return titles.get(position);
		}

		@Override
		public long getItemId(int position) {
			return 0;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			if (convertView == null) {
				convertView = LayoutInflater.from(ListviewTestActivity.this).inflate(
						R.layout.list_item, null);
			}
			TextView textView = (TextView) convertView.findViewById(R.id.title);
			textView.setText(titles.get(position));
			return convertView;
		}
		
	}

}


DragListView.java
package com.iaiai.activity;

import java.text.SimpleDateFormat;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;

/**
 * 
 * <br/>
 * Title: DragListView.java<br/>
 * E-Mail: 176291935@qq.com<br/>
 * QQ: 176291935<br/>
 * Http: iaiai.iteye.com<br/>
 * Create time: 2013-8-5 下午3:06:25<br/>
 * <br/>
 * 
 * @author 丸子
 * @version 0.0.1
 */
public class DragListView extends ListView implements OnScrollListener, OnClickListener {

	public interface Handler {
		/**
		 * 手指从上往下拉刷新之后会调用此方法
		 */
		void upRefresh();

		/**
		 * 手指从下往上拉刷新之后会调用此方法
		 */
		void downRefresh();
	}

	public DragListView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);

		init(context);
	}

	public DragListView(Context context, AttributeSet attrs) {
		super(context, attrs);

		init(context);
	}

	public DragListView(Context context) {
		super(context);

		init(context);
	}

	/***
	 * 作用:测量 headView的宽和高.
	 * 
	 * @param child
	 */
	private void measureView(View child) {
		ViewGroup.LayoutParams p = child.getLayoutParams();
		if (p == null) {
			p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
		}
		int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0 + 0, p.width);
		int lpHeight = p.height;
		int childHeightSpec;
		if (lpHeight > 0) {
			childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY);
		} else {
			childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
		}
		child.measure(childWidthSpec, childHeightSpec);
	}

	private void init(Context context) {
		this.context = context;
		headerLayout = getHeaderLayout();
		addHeaderView(headerLayout, null, false);
		mHeadViewHeight = headerLayout.getMeasuredHeight();
		headerLayout.setPadding(0, -1 * mHeadViewHeight, 0, 0);

		footerLayout = getFooterLayout();
		addFooterView(footerLayout, null, false);

		setOnScrollListener(this);// ListView滚动监听
	}

	private LinearLayout getHeaderLayout() {
		LinearLayout headerLayout = new LinearLayout(context);
		headerLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 0));
		headerLayout.setBackgroundResource(android.R.color.white);
		headerLayout.setGravity(Gravity.CENTER);
		headerLayout.setOrientation(LinearLayout.VERTICAL);
		
		LinearLayout layout = new LinearLayout(context);
		layout.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
		layout.setOrientation(LinearLayout.HORIZONTAL);
		layout.setPadding(0, dipTopx(10), 0, 0);
		
		headerProgressBar = new ProgressBar(context);
		headerProgressBar.setLayoutParams(new LayoutParams(dipTopx(20), dipTopx(20)) );
		headerProgressBar.setProgressDrawable(getResources().getDrawable(android.R.drawable.progress_horizontal));
		headerProgressBar.setVisibility(View.GONE);
		layout.addView(headerProgressBar);

		headerTextView = new TextView(context);
		headerTextView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
		headerTextView.setText("下拉手指刷新");
		layout.addView(headerTextView);
		headerLayout.addView(layout);

		headerTextView_date = new TextView(context);
		headerTextView_date.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
		headerTextView_date.setText(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new java.util.Date()));
		headerTextView_date.setPadding(0, 0, 0, dipTopx(10));
		headerLayout.addView(headerTextView_date);

		measureView(headerLayout);
		return headerLayout;
	}

	private LinearLayout getFooterLayout() {
		LinearLayout footerLayout = new LinearLayout(context);
		footerLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, 0));
		footerLayout.setBackgroundResource(android.R.color.white);
		footerLayout.setOrientation(LinearLayout.VERTICAL);
		
		LinearLayout lineLayout = new LinearLayout(context);
		lineLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, dipTopx(1)));
		lineLayout.setBackgroundColor(this.getCacheColorHint());
		footerLayout.addView(lineLayout);
		
		LinearLayout layout = new LinearLayout(context);
		layout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
		layout.setPadding(0, dipTopx(10), 0, dipTopx(10));
		layout.setGravity(Gravity.CENTER);
		layout.setOrientation(LinearLayout.HORIZONTAL);

		footerProgressBar = new ProgressBar(context);
		footerProgressBar.setLayoutParams(new LayoutParams(dipTopx(20), dipTopx(20)));
		footerProgressBar.setProgressDrawable(getResources().getDrawable(android.R.drawable.progress_horizontal));
		footerProgressBar.setVisibility(View.GONE);
		layout.addView(footerProgressBar);
		
		footerTextView = new TextView(context);
		footerTextView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
		footerTextView.setText("加载更多");
		layout.addView(footerTextView);
		footerLayout.addView(layout);

		measureView(footerLayout);
		footerLayout.setOnClickListener(this);
		return footerLayout;
	}

	// 拖拉ListView枚举所有状态
	private enum DListViewState {
		LV_NORMAL, // 普通状态
		LV_PULL_REFRESH, // 下拉状态(为超过mHeadViewHeight)
		LV_RELEASE_REFRESH, // 松开可刷新状态(超过mHeadViewHeight)
		LV_LOADING, // 加载状态
		LV_OVER; // 结束状态
	}

	public void setHandler(Handler handler) {
		this.handler = handler;
	}

	private Context context;

	private Handler handler;

	private LinearLayout headerLayout;
	private LinearLayout footerLayout;
	
	private ProgressBar headerProgressBar,footerProgressBar;

	private TextView headerTextView, headerTextView_date,footerTextView;

	private boolean isScroller = true;// 是否屏蔽ListView滑动

	private boolean mFirstItemIndex = false;// 当前视图能看到的第一个项的索引

	private boolean mIsRecord = false;// 用于保证startY的值在一个完整的touch事件中只被记录一次

	private int mStartY, mMoveY;// 按下是的y坐标,move时的y坐标

	private DListViewState mlistViewState = DListViewState.LV_NORMAL;// 拖拉状态.(自定义枚举)
	private DListViewState mfootViewState = DListViewState.LV_NORMAL;// 拖拉状态.(自定义枚举)

	private final static int RATIO = 2;// 手势下拉距离比.

	private int mHeadViewHeight;// headView的高(mHeadView)

	@Override
	public void onClick(View v) {
		if(!getAdapter().isEmpty()){
			if(mfootViewState==DListViewState.LV_NORMAL){
				footerTextView.setText("正在刷新");
				mfootViewState = DListViewState.LV_LOADING;
				footerProgressBar.setVisibility(View.VISIBLE);
				handler.downRefresh();
			}
		}
	}

	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {

	}

	/**
	 * 关闭头
	 */
	public void closeHeader() {
		mlistViewState = DListViewState.LV_NORMAL;
		headerProgressBar.setVisibility(View.GONE);
		headerLayout.setPadding(0, -1 * mHeadViewHeight, 0, 0);
		setSelection(0);
	}

	/**
	 * 关闭底
	 */
	public void closeFooter() {
		setSelection(getCount());
		footerTextView.setText("加载更多");
		footerProgressBar.setVisibility(View.GONE);
		mfootViewState = DListViewState.LV_NORMAL;
	}

	@Override
	public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
		if (firstVisibleItem <= 0) {
			mFirstItemIndex = true;
		} else {
			mFirstItemIndex = false;
		}
	}

	@Override
	public boolean onTouchEvent(MotionEvent ev) {
		switch (ev.getAction()) {
		// 按下
		case MotionEvent.ACTION_DOWN:
			doActionDown(ev);
			break;
		// 移动
		case MotionEvent.ACTION_MOVE:
			doActionMove(ev);
			break;
		// 抬起
		case MotionEvent.ACTION_UP:
			doActionUp(ev);
			break;
		default:
			break;
		}

		/***
		 * 如果是ListView本身的拉动,那么返回true,这样ListView不可以拖动.
		 * 如果不是ListView的拉动,那么调用父类方法,这样就可以上拉执行.
		 */
		if (isScroller) {
			return super.onTouchEvent(ev);
		} else {
			return true;
		}
	}

	/***
	 * 摁下操作
	 * 
	 * 作用:获取摁下是的y坐标
	 * 
	 * @param event
	 */
	void doActionDown(MotionEvent event) {
		if(getAdapter().isEmpty()){
			return;
		}
		mStartY = (int) event.getY();
		if (mIsRecord == false && mFirstItemIndex) {
			mIsRecord = true;
		}
	}

	/***
	 * 拖拽移动操作
	 * 
	 * @param event
	 */
	void doActionMove(MotionEvent event) {
		if(getAdapter().isEmpty()){
			return;
		}
		mMoveY = (int) event.getY();// 获取实时滑动y坐标
		// 检测是否是一次touch事件.
		if (mIsRecord == false && mFirstItemIndex) {
			mStartY = (int) event.getY();
			mIsRecord = true;
		}
		Log.i("********", "*****" + mIsRecord);
		
		// 向下啦headview移动距离为y移动的一半.(比较友好)
		int offset = (mMoveY - mStartY) / RATIO;
		
		/***
		 * 如果touch关闭或者正处于Loading状态的话 return.
		 */
		if (mIsRecord == false || mlistViewState == DListViewState.LV_LOADING) {
			return;
		}

		switch (mlistViewState) {
		// 普通状态
		case LV_NORMAL: {
			Log.i("********", "******普通状态");
			// 如果<0,则意味着上滑动.
			if (offset > 0) {
				// 设置headView的padding属性.
				headerLayout.setPadding(0, offset - mHeadViewHeight, 0, 0);
				mlistViewState = DListViewState.LV_PULL_REFRESH;// 下拉状态
			}

		}
			break;
		// 下拉状态
		case LV_PULL_REFRESH: {
			setSelection(0);// 时时保持在顶部.
			headerTextView.setText("下拉手指刷新");
			headerTextView_date.setText(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new java.util.Date()));
			// 设置headView的padding属性.
			headerLayout.setPadding(0, offset - mHeadViewHeight, 0, 0);
			if (offset < 0) {
				/***
				 * 要明白为什么isScroller = false;
				 */
				isScroller = false;
				mlistViewState = DListViewState.LV_NORMAL;// 普通状态
			} else if (offset > mHeadViewHeight) {// 如果下拉的offset超过headView的高度则要执行刷新.
				mlistViewState = DListViewState.LV_RELEASE_REFRESH;// 更新为可刷新的下拉状态.
			}
		}
			break;
		// 可刷新状态
		case LV_RELEASE_REFRESH: {
			Log.i("********", "******可刷新状态");
			setSelection(0);// 时时保持在顶部
			headerTextView.setText("松开手指刷新");
			// 设置headView的padding属性.
			headerLayout.setPadding(0, offset - mHeadViewHeight, 0, 0);
			// 下拉offset>0,但是没有超过headView的高度.那么要goback 原装.
			if (offset >= 0 && offset <= mHeadViewHeight) {
				mlistViewState = DListViewState.LV_PULL_REFRESH;
			} else if (offset < 0) {
				mlistViewState = DListViewState.LV_NORMAL;
			} else {

			}
		}
			break;
		default:
			return;
		}
	}

	/***
	 * 手势抬起操作
	 * 
	 * @param event
	 */
	public void doActionUp(MotionEvent event) {
		if(getAdapter().isEmpty()){
			return;
		}

		if((((int)event.getY())-mStartY)<-45&&getLastVisiblePosition()>=(getCount()-1)){
			//加载更多
			onClick(footerLayout);
			return;
		}

		mIsRecord = false;// 此时的touch事件完毕,要关闭。
		isScroller = true;// ListView可以Scrooler滑动.
		// 如果下拉状态处于loading状态.
		if (mFirstItemIndex) {
			if (mlistViewState != DListViewState.LV_LOADING) {
				// 处理相应状态.
				switch (mlistViewState) {
				// 普通状态
				case LV_NORMAL:

					break;
				// 下拉状态
				case LV_PULL_REFRESH:
					headerLayout.setPadding(0, -1 * mHeadViewHeight, 0, 0);
					mlistViewState = DListViewState.LV_NORMAL;
					break;
				// 刷新状态
				case LV_RELEASE_REFRESH:
					headerLayout.setPadding(0, 0, 0, 0);
					mlistViewState = DListViewState.LV_LOADING;
					headerTextView.setText("正在刷新");
					headerProgressBar.setVisibility(View.VISIBLE);
					if (handler != null)
						handler.upRefresh();// 上拉刷新
					break;
				}
			}
		}
	}
	
	private int dipTopx(float dpValue) {
		final float scale = context.getResources().getDisplayMetrics().density;
		return (int) (dpValue * scale + 0.5f);
	}
}

    
[3] tableview设立上下滚动高度
    来源: 互联网  发布时间: 2014-02-18
tableview设置上下滚动高度
可在viewDidAppear中实现加入 [tablvew setContentOffset:CGPointMake(0,480) animated:YES]; 
在tableView内添加一个searchbar,一起滚动;开始时隐藏headerView(即让tableView向上滚动headerView的高度:默认44) 
UISearchBar *mySearchBar = [[UISearchBar alloc] init]; 
[mySearchBar sizeToFit]; 
 
tableView.tableHeaderView = mySearchBar; 
//UITableView开始滚动到的位置(这样一开始headerView是不显示的) 
[tableView setContentOffset:CGPointMake(0.0, 44.0) animated:NO]; 

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3