实现单选必须要设置ListView为CHOICE_MODE_SINGLE(listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE)或android:choiceMode=”singleChoice”)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
private int cur_pos = 0;// 当前显示的一行
private String[] items_text = { "选项一", "选项二", "选项三", "选项四", "选项五" };
...
final Mydapter dapter = new Mydapter(this);
ListView listview = (ListView) findViewById(R.id.listView);
listview.setAdapter(dapter);
listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int position, long id) {
cur_pos = position;// 更新当前行
dapter.notifyDataSetChanged();
}
});


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class Mydapter extends BaseAdapter {
private LayoutInflater inflater;

public Mydapter(Context context) {
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public int getCount() {
return items_text.length;
}

@Override
public Object getItem(int position) {
return items_text[position];
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.e("TEST", "refresh once");
convertView = inflater.inflate(R.layout.item, null, false);
TextView tv = (TextView) convertView.findViewById(R.id.tv);// 显示文字
tv.setText(items_text[position]);
if (position == cur_pos) {// 如果当前的行就是ListView中选中的一行,就更改显示样式
convertView.setBackgroundColor(R.drawable.channel_list_item_bg_selected);// 更改整行的背景色
}
return convertView;
}
}

例子

常用配置

1
2
3
4
5
6
7
8
9
--- system # 系统级别
--- global # 用户全局
--local # 单独一个项目
git config --global user.name "xxx" # 用户名
git config --global user.email "xxx@xxx.com" # 邮箱
git config --global core.editor vim # 编辑器

git config --global alias.st status # 配置别名
git config -l 列举所有配置

Git中3中状态的一些操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# 将工作区的修改提交到暂存区
git add <file>
git add .
# ------------------------------------------

# 将暂存区的内容提交到版本库
git commit <file>
git commit .
git commit -a # 包括git add/ git rm /git commint 这三个操作,所有一般在操作工作区的时候,直接删除了文件,而不是使用git rm的,最后提交是可以用这个,如下
# git commit -am "提交信息"
git commit -amend # 修改最后一次提交的信息

# 抛弃工作区修改(使用当前暂存区的内容状态去覆盖工作区,从而达到抛弃工作区修改的作用)
git checkout <file>
git checkout .

# ------------------------------------------

# 改变暂存区的修改(其实是重置HEAD,将指定版本库的内容状态去覆盖暂存区,从而达到暂存区的改变)
git reset <file> # 从暂存区恢复到工作区(不指定版本id,则默认为最后一次提交的版本id)
git reset . # 从暂存区恢复到工作区
git reset $id # 恢复到指定的提交版本,该$id之后的版本提交都恢复到工作区
git reset --hard $id # 恢复到指定的提交版本,该$id之后的版本提交全部会被抛弃,将不出现在工作区

# 注:如果不小心使用了错误的HEAD重置,会发现HEAD指向了重置的版本id,该版本之后的版本提交都不见了,使用git log也无法找到,需要使用下面的命令
git reflog show master | head # 会显示所有版本纪录
git reset --hard $id # 重新重置,至于--hard,根据将改变的内容放到工作区还是直接抛弃进行选择

# ------------------------------------------
# 恢复某次提交(某次提交的回滚操作,不影响其他的提交,所产生的效果创建一个新的版本提交去回滚指定的提交)
git revert <$id>
git revert HEAD
# revert和reset的差异:git reset是把HEAD向后移动了以下,而git revert是HEAD继续前进,只是新的内容和revert的内容正好相反

# ------------------------------------------
# 删除文件
# 1.在工作区删除
rm your_file # 直接在工作区删除文件
git add -u . # 将有改动的都提交到暂存区(包括修改的,删除的等操作)。git 2.0后不加-u也可以
git commit -m "message" # 提交到版本库

# 2.同样在工作区删除
rm your_file
git commit -am "message" # -a包括了 git add/git rm/git commit三个操作

# 3.使用git rm
git rm <file> # 不仅在工作区删除文件,同时将删除操作提交到暂存区
git commit -m "message" # 提交到版本库

# git rm其他补充
git rm --cached <file> # 从暂存区中去除该文件,git将不再跟踪该文件的变更,但仍然在工作区内

文件直接比较差异Diff

1
2
3
4
5
6
git diff
git diff <file> # 比较工作区与暂存区文件的差异
git diff --cached # 比较暂存区和版本库差异

git diff <$id2><$id2> # 比较两次提交之间的差异
git diff <branch1>..<branch2> # 比较两个分支之间的差异

分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
git branch -r # 查看远程分支
git branch new_branch_name # 新建一个分支
git branch --merged # 查看未被合并到当前分支的分支

git checkout branch_name # 切换分支
git checkout -b branch_name # 创建分支并切换

git branch -d branch_name # 删除分支
git branch -D branch_name # 强制删除分支
git push origin :branch_name # 删除远程分支(现在本地删除该分支),原理是把一个空分支push到server上,相对于删除该分支

# 从远程clone项目,虽然远程上项目有分支,但是clone下来只有master分支,解决
git checkout -b not_master_branch origin/not_master_branch # 本地创建一个分支,指向对应的远程分支
git pull origin not_master_branch # 将远程的not_master_branch分支pull下来
git push origin not_master_branch # 将修改后的not_master_branch分支push到远程的not_master_branch分支

远程

1
2
3
4
5
git remote -v 			# 查看远程服务器地址和仓库名称
git remote show origin # 查看远程服务器仓库状态
git remote add origin git@github:robbin/robbin_site.git # 添加远程仓库地址
git remote set-url origin git@github.com:robin/robbin # 修改远程仓库地址
git remote rm # 删除远程仓库地址

从远程拉取内容、提交内容

1
2
3
4
5
6
7
8
9
10
git fetch # 拉取
git merge # 合并
git pull # git fetch + git merge

git push # push所有分支
git push origin master # 将本地主分支推到远程主分支
git push -u origin master # 将本地主分支推到远程(如果远程无主分支则创建,用于初始化远程仓库)
git push origin <local_brabch> # 创建远程分支,origin是远程仓库名
git push origin <local_brabch>:<remote_branch> # 创建远程分支
git push origin :<remote_branch> # 先删除本地分支,然后再push删除远程分支

暂存管理

1
2
3
4
5
git stash # 将工作区做的修改暂存到一个git栈中
git stash list # 查看栈中所有暂存
git stach apply <暂存编号> # 恢复对应编号暂存到工作区,如果不指定编号为栈顶,操作中这些暂缓还在栈中
git stach pop # 将栈顶的暂存恢复到工作区,并从栈中弹出
git stach clear # 清空暂存区

创建远程库

1
2
git clone --bare git_url_path # clone的时候,将其创建成远程仓库
git --bare init # 初始化项目的时候,创建成远程仓库

在基类BaseActivity中加入如下函数

1
2
3
4
5
6
7
8
public final <E extends View> E getView (int id) {
try {
return (E) findViewById(id);
} catch (ClassCastException ex) {
Log.e(TAG,"Could not cast View to concrete class.",ex);
throw ex;
}
}

使用ViewFinder类,封装了常用的方法。可以在Activity或View中调用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
public class ViewFinder {
private static interface FindWrapper {
View findViewById(int id);
Resources getResources();
}

private static class WindowWrapper implements FindWapper {
private final Window window;

WidowWrapper(final Window window) {
this.window = window;
}

public View findViewById(final int id) {
return window.findViewById(id);
}

public Resources getResources() {
return window.getContext().getResouces();
}
}

private static class ViewWrapper implements FindWrapper {
private final View view;

ViewWrapper(final View view) {
this.view = view;
}

public View findViewById(int id) {
return view.findViewById(id);
}

public Resources getResources() {
return view.getResources();
}
}

private final FindWrapper wrapper;

public ViewFinder(final View view) {
wrapper = new ViewWrapper(view);
}

public ViewFinder(final Window window) {
wrapper = new WindowWrapper(window);
}

public ViewFinder(final Activity activity) {
this(activity.getWindow());
}

public <V extends View> V find (final int id) {
return (V) wrapper.findViewById(id);
}

public ImageView imageView(final int id) {
return find(id);
}

public CompoundButton commpoudButton(final int id) {
return find(id);
}

public TextView textView(final int id) {
return find(id);
}

public TextView setText(final int id, final CharSequence content) {
final TextView text = find(id);
text.setText(content);
return text;
}

public TextView setText(final int id, final int content) {
return setText(id, wrapper.getResources().getString(content));
}

public View onClick(final int id, final Runnable runnable) {
return onClick(id, new OnClickListener() {

public void onClick(View v) {
runnable.run();
}
});
}

public void onClick(final OnClickListener listener, final int... ids) {
for (int id : ids)
find(id).setOnClickListener(listener);
}

public void onClick(final Runnable runnable, final int... ids) {
onClick(new OnClickListener() {

public void onClick(View v) {
runnable.run();
}
}, ids);
}

public ImageView setDrawable(final int id, final int drawable) {
ImageView image = imageView(id);
image.setImageDrawable(image.getResources().getDrawable(drawable));
return image;
}

public CompoundButton onCheck(final int id, final OnCheckedChangeListener listener) {
CompoundButton checkable = find(id);
checkable.setOnCheckedChangeListener(listener);
return checkable;
}

public CompoundButton onCheck(final int id, final Runnable runnable) {
return onCheck(id, new OnCheckedChangeListener() {

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
runnable.run();
}
});
}

public void onCheck(final OnCheckedChangeListener listener, final int... ids) {
for (int id : ids)
compoundButton(id).setOnCheckedChangeListener(listener);
}

public void onCheck(final Runnable runnable, final int... ids) {
onCheck(new OnCheckedChangeListener() {

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
runnable.run();
}
}, ids);
}
}

显示行号

General -> Editors -> Text Editors -> Show line numbers

使用快捷键新建Android工程

General -> Keys -> Command 在其中找到New(Android Application Project) 设置为 Ctrl+Alt+A

默认编码设置为UTF-8

General -> Workspace -> Text file encoding

XML代码保存后自动格式化

Android –> Editors –> Always remove empty lines between elements:不要勾选,以确保个元素之间都有一个空行;Format on Save:勾选。

Java代码保存时自动格式化:

Java –> Editor –> Save Actions –> Perform the selected actions on save
–> 勾选 Format source code(如果是一个人写代码,可以勾选Format all lines;如果需要通过SVN/Git等与他人合作,一定不能勾选Format all lines而是勾选Format edited lines)

Java代码中键入分号“;”、花括号“}”时自动调整位置:

Java –> Editor –> Typing –> Automatically insert at correct position 勾选Semicolons(分号),Braces(花括号)

安装color theme

Help→Install New Software -> Add 添加 http://eclipse-color-theme.github.com/update 然后下一步下一步就好
安装完成 Window→Preferences→General→Appereance→Color Theme 选择自己喜欢的theme换上即可

之前的blog是使用gitpress,方便简单,只需要维护本地的一个工程就好。但是连续跪了两次了,毕竟是个小众的blog,个人开发者维护跟不上,决定转移到hexo上了。
GitHub page + hexo 确实是个不错的方案,模板也比较多,遂,投奔。

scaletype决定了图片在View上显示的方式,可以通过xml中定义android:scale=或者代码中调用imageView.setScaleType()

示例的原图
128*128


640*428

  1. CENTER
    按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示

  2. CENTER_CROP
    按比例扩大图片的size居中显示,使得图片长(宽)等于或大于view的长(宽)

  3. CENTER_INSIDE
    将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽

  4. FIT_CENTER
    把图片按比例扩大/缩小到View的宽度,居中显示

  5. FIT_START, FIT_END
    图片缩放效果上与FIT_CENTER一样,只是显示的位置不同,FIT_START是置于顶部,FIT_CENTER居中,FIT_END置于底部。
  6. FIT_XY
    不按比例缩放图片,目标是把图片塞满整个View。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//
// _oo0oo_
// o8888888o
// 88" . "88
// (| -_- |)
// 0\ = /0
// ___/`---'\___
// .' \\| |// '.
// / \\||| : |||// \
// / _||||| -:- |||||- \
// | | \\\ - /// | |
// | \_| ''\---/'' |_/ |
// \ .-\__ '-' ___/-. /
// ___'. .' /--.--\ `. .'___
// ."" '< `.___\_<|>_/___.' >' "".
// | | : `- \`.;`\ _ /`;.`/ - ` : | |
// \ \ `_. \_ __\ /__ _/ .-` / /
// =====`-.____`.___ \_____/___.-`___.-'=====
// `=---='
//
//
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// 佛祖保佑 永无BUG
//
//
//

神兽

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/*code is far away from bug with the animal protecting
* ┏┓   ┏┓
*┏┛┻━━━┛┻┓
*┃       ┃  
*┃   ━   ┃
*┃ ┳┛ ┗┳ ┃
*┃       ┃
*┃   ┻   ┃
*┃       ┃
*┗━┓   ┏━┛
*  ┃   ┃神兽保佑
*  ┃   ┃代码无BUG!
*  ┃   ┗━━━┓
*  ┃       ┣┓
*  ┃       ┏┛
*  ┗┓┓┏━┳┓┏┛
*   ┃┫┫ ┃┫┫
*   ┗┻┛ ┗┻┛
*   
*/

1
2
3
4
5
6
7
8
9
10
11
//
// █████▒█ ██ ▄████▄ ██ ▄█▀ ██████╗ ██╗ ██╗ ██████╗
// ▓██ ▒ ██ ▓██▒▒██▀ ▀█ ██▄█▒ ██╔══██╗██║ ██║██╔════╝
// ▒████ ░▓██ ▒██░▒▓█ ▄ ▓███▄░ ██████╔╝██║ ██║██║ ███╗
// ░▓█▒ ░▓▓█ ░██░▒▓▓▄ ▄██▒▓██ █▄ ██╔══██╗██║ ██║██║ ██║
// ░▒█░ ▒▒█████▓ ▒ ▓███▀ ░▒██▒ █▄ ██████╔╝╚██████╔╝╚██████╔╝
// ▒ ░ ░▒▓▒ ▒ ▒ ░ ░▒ ▒ ░▒ ▒▒ ▓▒ ╚═════╝ ╚═════╝ ╚═════╝
// ░ ░░▒░ ░ ░ ░ ▒ ░ ░▒ ▒░
// ░ ░ ░░░ ░ ░ ░ ░ ░░ ░
// ░ ░ ░ ░ ░
// ░
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 //
// .::::.
// .::::::::.
// :::::::::::
// ..:::::::::::'
// '::::::::::::'
// .::::::::::
// '::::::::::::::..
// ..::::::::::::.
// ``::::::::::::::::
// ::::``:::::::::' .:::.
// ::::' ':::::' .::::::::.
// .::::' :::: .:::::::'::::.
// .:::' ::::: .:::::::::' ':::::.
// .::' :::::.:::::::::' ':::::.
// .::' ::::::::::::::' ``::::.
// ...::: ::::::::::::' ``::.
// ```` ':. ':::::::::' ::::..
// '.:::::' ':'````..

SwipeView提供了同级屏幕中的横向导航。
适配器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class DemoCollectionPagerAdapter extends FragmentStatePagerAdapter{
public DemoCollectionPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
Fragment fragment = new DemoObjectFragment();
Bundle args = new Bundle();
// 我们的对象只是一个整数 :-P
args.putInt(DemoObjectFragment.ARG_OBJECT, i + 1);
fragment.setArguments(args);
return fragment;
}
@Override
public int getCount() {
return 100;
}

@Override
public CharSequence getPageTitle(int position) {
return "OBJECT " + (position + 1);
}
}

布局文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/pager">
<android.support.v4.view.PagerTabStrip
android:id="@+id/pager_title_strip"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:background="# 33b5e5"
android:textColor="# fff"
android:paddingTop="4dp"
android:paddingBottom="4dp" />
</android.support.v4.view.ViewPager>

Fragment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class DemoObjectFragment extends Fragment {
public static final String ARG_OBJECT = "object";

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// 最后两个参数保证LayoutParam能被正确填充
View rootView = inflater.inflate(R.layout.fragment_collection_object,
container, false);
Bundle args = getArguments();
((TextView) rootView.findViewById(R.id.textView1)).setText(Integer
.toString(args.getInt(ARG_OBJECT)));
return rootView;
}
}