Android中Adapter中edittext,checkbox记住状态解决方案
Android中Adapter中edittext,checkbox记住状态解决方案(一)
转载地址:http://blog.csdn.net/footballclub/article/details/43123105
一、问题原因
我们都知道Android中的adapter的view是用了重用机制的,简单地说就是当屏幕中的item占满屏幕以后,我们滑动listview的时候,第一个item退出屏幕,最后一个item进入屏幕
[java] view plain copy
- View getView(final int position, View convertView, ViewGroup parent)
这个缓存机制就是导致问题出现的根本原因。可能有人就说了,只要不用convertview来缓存不就能解决问题了么。对于这样的解决方案,我只能说,能使用这种方案的都是用屁股在思考问题!
二、问题解决
1.上面有两个问题,分别是editText和checkBox,我们先从简单的来,checkbox只需要考虑两种状态就行了,所以就先解决checkBox
首先用enum来标记下选中和未选中这两种状态
[java] view plain copy
- public enum Type {
- Checked, UnCheck;
- }
- private List
list; - private List
typeList = new ArrayList(); - public CartAdapter(Context context, List
list) { - this.list = list;
- this.context = context;
- initData();
- }
- private void initData() {
- for (CartBean cartBean : list) {
- Type type = Type.UnCheck;
- typeList.add(type);
- }
[java] view plain copy
- mHolder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(CompoundButton buttonView,
- boolean isChecked) {
- if (isChecked) {
- typeList.set(position, Type.Checked);
- } else {
- typeList.set(position, Type.UnCheck);
- }
- }
- });
- f (typeList.get(position) == Type.Checked) {
- mHolder.cb.setChecked(true);
- } else if (typeList.get(position) == Type.UnCheck) {
- mHolder.cb.setChecked(false);
- } else {
- mHolder.cb.setChecked(false);
- }
我就举个例子吧,譬如说我选中了第一个item的checkbox,屏幕能显示10个item,当滑动item的时候,第十一个出来,它重用的第一个item的view,checkbox也是第一个的,监听也是第一个的。那么系统在执行这段代码的时候
[java] view plain copy
- if (typeList.get(position) == Type.Checked) {
- mHolder.cb.setChecked(true);
- } else if (typeList.get(position) == Type.UnCheck) {
- mHolder.cb.setChecked(false);
- } else {
- mHolder.cb.setChecked(false);
- }
就得把这个checkbox的状态从选中改成未选中的状态,这样就会触发监听事件
[java] view plain copy
- public void onCheckedChanged(CompoundButton buttonView,
- boolean isChecked) {
- if (isChecked) {
- typeList.set(position, Type.Checked);
- } else {
- typeList.set(position, Type.UnCheck);
- }
- }
所以为了避免这个问题,每次都必须先注册监听,再根据typelist中存储的状态来设置item是否选中。
checkbox的问题解决了,接下来就是editText的了,这个有点麻烦,大家看我文章开头的图片,我不仅要保存edittext里面的值,还要保证在操作加、减button的时候,操作的edittext对象是正确的,最后还有焦点问题。
2.先说说焦点问题,就是在listview中我们点击editText会发现,软键盘是弹出来了,光标也移到EditText上面了;但是,不管输入什么editText里面都不显示!对于这个,我们可以在Activity里面这么配置
android:windowSoftInputMode="adjustPan",这个就是设置输入法的弹出模式,不挤压布局,输入法会覆盖在布局之上,同时editText也会获得焦点。其实之前editText不能输入也是因为没有焦点的缘故,这样就可以解决问题了。也不需要自己动态的获取editText的焦点了。
这个时候edittext能够输入内容了,接下来就是保存内容和button能操作对位的edittext。
我的做法是把edittext这个对象保存在list中,这样的做法不是很好,因为edittext不能序列化存储,我们没法把它持久化存储,这就造成这个对象容易丢。我们都知道系统在横竖屏切换的时候,Activity会重启或者在应用长时间处于后台的时候,系统会把Activity给清掉,等用户回到应用的时候会再重启Activity,如果我们无法存储状态的话,从用户体验上来说就不是很好。或许可以把这个list放在application中静态存储,就和项目中管理所有Activity的list一样。
还没有说完,下篇文章会有demo。
Android中Adapter中edittext,checkbox记住状态解决方案(二)
一、问题原因
我们都知道Android中的adapter的view是用了重用机制的,简单地说就是当屏幕中的item占满屏幕以后,我们滑动listview的时候,第一个item退出屏幕,最后一个item进入屏幕
[java] view plain copy
- View getView(final int position, View convertView, ViewGroup parent)
这个缓存机制就是导致问题出现的根本原因。可能有人就说了,只要不用convertview来缓存不就能解决问题了么。对于这样的解决方案,我只能说,能使用这种方案的都是用屁股在思考问题!
二、问题解决
1.上面有两个问题,分别是editText和checkBox,我们先从简单的来,checkbox只需要考虑两种状态就行了,所以就先解决checkBox
首先用enum来标记下选中和未选中这两种状态
[java] view plain copy
- public enum Type {
- Checked, UnCheck;
- }
- private List
list; - private List
typeList = new ArrayList(); - public CartAdapter(Context context, List
list) { - this.list = list;
- this.context = context;
- initData();
- }
- private void initData() {
- for (CartBean cartBean : list) {
- Type type = Type.UnCheck;
- typeList.add(type);
- }
[java] view plain copy
- mHolder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(CompoundButton buttonView,
- boolean isChecked) {
- if (isChecked) {
- typeList.set(position, Type.Checked);
- } else {
- typeList.set(position, Type.UnCheck);
- }
- }
- });
- f (typeList.get(position) == Type.Checked) {
- mHolder.cb.setChecked(true);
- } else if (typeList.get(position) == Type.UnCheck) {
- mHolder.cb.setChecked(false);
- } else {
- mHolder.cb.setChecked(false);
- }
我就举个例子吧,譬如说我选中了第一个item的checkbox,屏幕能显示10个item,当滑动item的时候,第十一个出来,它重用的第一个item的view,checkbox也是第一个的,监听也是第一个的。那么系统在执行这段代码的时候
[java] view plain copy
- if (typeList.get(position) == Type.Checked) {
- mHolder.cb.setChecked(true);
- } else if (typeList.get(position) == Type.UnCheck) {
- mHolder.cb.setChecked(false);
- } else {
- mHolder.cb.setChecked(false);
- }
就得把这个checkbox的状态从选中改成未选中的状态,这样就会触发监听事件
[java] view plain copy
- public void onCheckedChanged(CompoundButton buttonView,
- boolean isChecked) {
- if (isChecked) {
- typeList.set(position, Type.Checked);
- } else {
- typeList.set(position, Type.UnCheck);
- }
- }
所以为了避免这个问题,每次都必须先注册监听,再根据typelist中存储的状态来设置item是否选中。
checkbox的问题解决了,接下来就是editText的了,这个有点麻烦,大家看我文章开头的图片,我不仅要保存edittext里面的值,还要保证在操作加、减button的时候,操作的edittext对象是正确的,最后还有焦点问题。
2.先说说焦点问题,就是在listview中我们点击editText会发现,软键盘是弹出来了,光标也移到EditText上面了;但是,不管输入什么editText里面都不显示!对于这个,我们可以在Activity里面这么配置
android:windowSoftInputMode="adjustPan",这个就是设置输入法的弹出模式,不挤压布局,输入法会覆盖在布局之上,同时editText也会获得焦点。其实之前editText不能输入也是因为没有焦点的缘故,这样就可以解决问题了。也不需要自己动态的获取editText的焦点了。
这个时候edittext能够输入内容了,接下来就是保存内容和button能操作对位的edittext。
我的做法是把edittext这个对象保存在list中,这样的做法不是很好,因为edittext不能序列化存储,我们没法把它持久化存储,这就造成这个对象容易丢。我们都知道系统在横竖屏切换的时候,Activity会重启或者在应用长时间处于后台的时候,系统会把Activity给清掉,等用户回到应用的时候会再重启Activity,如果我们无法存储状态的话,从用户体验上来说就不是很好。或许可以把这个list放在application中静态存储,就和项目中管理所有Activity的list一样。
还没有说完,下篇文章会有demo。
Android中Adapter中edittext,checkbox记住状态解决方案(二)
Android中Adapter中edittext,checkbox记住状态解决方案(二)
一、问题原因
我们都知道Android中的adapter的view是用了重用机制的,简单地说就是当屏幕中的item占满屏幕以后,我们滑动listview的时候,第一个item退出屏幕,最后一个item进入屏幕
[java] view plain copy
- View getView(final int position, View convertView, ViewGroup parent)
这个缓存机制就是导致问题出现的根本原因。可能有人就说了,只要不用convertview来缓存不就能解决问题了么。对于这样的解决方案,我只能说,能使用这种方案的都是用屁股在思考问题!
二、问题解决
1.上面有两个问题,分别是editText和checkBox,我们先从简单的来,checkbox只需要考虑两种状态就行了,所以就先解决checkBox
首先用enum来标记下选中和未选中这两种状态
[java] view plain copy
- public enum Type {
- Checked, UnCheck;
- }
- private List
list; - private List
typeList = new ArrayList(); - public CartAdapter(Context context, List
list) { - this.list = list;
- this.context = context;
- initData();
- }
- private void initData() {
- for (CartBean cartBean : list) {
- Type type = Type.UnCheck;
- typeList.add(type);
- }
[java] view plain copy
- mHolder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(CompoundButton buttonView,
- boolean isChecked) {
- if (isChecked) {
- typeList.set(position, Type.Checked);
- } else {
- typeList.set(position, Type.UnCheck);
- }
- }
- });
- f (typeList.get(position) == Type.Checked) {
- mHolder.cb.setChecked(true);
- } else if (typeList.get(position) == Type.UnCheck) {
- mHolder.cb.setChecked(false);
- } else {
- mHolder.cb.setChecked(false);
- }
我就举个例子吧,譬如说我选中了第一个item的checkbox,屏幕能显示10个item,当滑动item的时候,第十一个出来,它重用的第一个item的view,checkbox也是第一个的,监听也是第一个的。那么系统在执行这段代码的时候
[java] view plain copy
- if (typeList.get(position) == Type.Checked) {
- mHolder.cb.setChecked(true);
- } else if (typeList.get(position) == Type.UnCheck) {
- mHolder.cb.setChecked(false);
- } else {
- mHolder.cb.setChecked(false);
- }
就得把这个checkbox的状态从选中改成未选中的状态,这样就会触发监听事件
[java] view plain copy
- public void onCheckedChanged(CompoundButton buttonView,
- boolean isChecked) {
- if (isChecked) {
- typeList.set(position, Type.Checked);
- } else {
- typeList.set(position, Type.UnCheck);
- }
- }
所以为了避免这个问题,每次都必须先注册监听,再根据typelist中存储的状态来设置item是否选中。
checkbox的问题解决了,接下来就是editText的了,这个有点麻烦,大家看我文章开头的图片,我不仅要保存edittext里面的值,还要保证在操作加、减button的时候,操作的edittext对象是正确的,最后还有焦点问题。
2.先说说焦点问题,就是在listview中我们点击editText会发现,软键盘是弹出来了,光标也移到EditText上面了;但是,不管输入什么editText里面都不显示!对于这个,我们可以在Activity里面这么配置
android:windowSoftInputMode="adjustPan",这个就是设置输入法的弹出模式,不挤压布局,输入法会覆盖在布局之上,同时editText也会获得焦点。其实之前editText不能输入也是因为没有焦点的缘故,这样就可以解决问题了。也不需要自己动态的获取editText的焦点了。
这个时候edittext能够输入内容了,接下来就是保存内容和button能操作对位的edittext。
我的做法是把edittext这个对象保存在list中,这样的做法不是很好,因为edittext不能序列化存储,我们没法把它持久化存储,这就造成这个对象容易丢。我们都知道系统在横竖屏切换的时候,Activity会重启或者在应用长时间处于后台的时候,系统会把Activity给清掉,等用户回到应用的时候会再重启Activity,如果我们无法存储状态的话,从用户体验上来说就不是很好。或许可以把这个list放在application中静态存储,就和项目中管理所有Activity的list一样。
还没有说完,下篇文章会有demo。
Android中Adapter中edittext,checkbox记住状态解决方案(二)
Android中Adapter中edittext,checkbox记住状态解决方案(一)
在上篇文章解决了adapter中checkbox记住状态和edittext可编辑的问题,下面谈谈怎么解决记住edittext中的内容和保证在操作加、减按钮的时候,操作的edittext对象是没有错位的问题。
一、记住edittext中的内容
解决的思路和checkbox差不多,不过还是有些差别,checkbox只有两种状态,而edittext的值是不固定的。checkbox我们是用一个enum类型的list来保存状态的,所以edittext就不能了,可以用map和实体类,我为了方便就用了hashMap。
[java] view plain copy
- // 用来存储editext中数据的list
- private Listnew ArrayList
[java] view plain copy
- for (CartBean cartBean : list) {
- mData.add(new HashMap
()); - }
edittext的监听,并且有个log
- mHolder.num.addTextChangedListener(new TextWatcher() {
- @Override
- public void onTextChanged(CharSequence s, int start, int before,
- int count) {
- }
- @Override
- public void beforeTextChanged(CharSequence s, int start, int count,
- int after) {
- }
- @Override
- public void afterTextChanged(Editable s) {
- if (!TextUtils.isEmpty(s.toString())) {
- if(!TextUtils.isEmpty(s.toString())){
- mData.get(position).put(etValue,
- s.toString());
- Log.i("afterTextChanged", "position"+position);
- }
- }
- }
- );
[java] view plain copy
- String value = mData.get(position).get(etValue);
- f (!TextUtils.isEmpty(value)) {
- mHolder.num.setText(value);
- else {
- mHolder.num.setText("1");
[java] view plain copy
- 01-27 15:55:46.612: I/afterTextChanged(4784): position0
- 01-27 15:55:46.622: I/afterTextChanged(4784): position1
- 01-27 15:55:46.632: I/afterTextChanged(4784): position2
- 01-27 15:55:46.642: I/afterTextChanged(4784): position3
- 01-27 15:55:46.642: D/AbsListView(4784): unregisterIRListener() is called
- 01-27 15:55:46.642: D/AbsListView(4784): unregisterIRListener() is called
- 01-27 15:55:46.662: D/AbsListView(4784): unregisterIRListener() is called
- 01-27 15:55:46.682: D/AbsListView(4784): unregisterIRListener() is called
- 01-27 15:55:56.882: I/afterTextChanged(4784): position4
结果发现是这样
[java] view plain copy
- 01-27 15:53:43.772: I/afterTextChanged(4784): position0
- 01-27 15:53:43.772: I/afterTextChanged(4784): position5
- 01-27 15:53:43.772: I/afterTextChanged(4784): position5
- 01-27 15:53:43.772: I/afterTextChanged(4784): position9
- 01-27 15:53:43.772: I/afterTextChanged(4784): position5
- 01-27 15:53:43.772: I/afterTextChanged(4784): position0
- 01-27 15:53:43.772: I/afterTextChanged(4784): position6
- 01-27 15:53:43.772: I/afterTextChanged(4784): position15
- 01-27 15:53:43.772: I/afterTextChanged(4784): position15
- 01-27 15:53:43.772: I/afterTextChanged(4784): position11
- 01-27 15:53:43.772: I/afterTextChanged(4784): position6
- 01-27 15:53:43.772: I/afterTextChanged(4784): position2
- 01-27 15:53:43.772: I/afterTextChanged(4784): position8
- 01-27 15:53:43.772: I/afterTextChanged(4784): position12
- 01-27 15:53:43.772: I/afterTextChanged(4784): position18
- 01-27 15:53:43.772: I/afterTextChanged(4784): position13
- 01-27 15:53:43.772: I/afterTextChanged(4784): position9
- 01-27 15:53:43.772: I/afterTextChanged(4784): position4
- 01-27 15:53:43.772: I/afterTextChanged(4784): position4
[java] view plain copy
- mHolder.num.addTextChangedListener(new TextWatcher()
[java] view plain copy
- public void addTextChangedListener(TextWatcher watcher) {
- if (mListeners == null) {
- mListeners = new ArrayList
(); - }
- mListeners.add(watcher);
- }
[java] view plain copy
- public void setOnClickListener(OnClickListener l) {
- if (!isClickable()) {
- setClickable(true);
- }
- getListenerInfo().mOnClickListener = l;
- }
问题找到那就好办了,其实adapter中的viewholder对象数目是固定的,在多也只会重用了,所以我们也可以设置和viewholder一样数量的监听就行了,可以这样做
[html] view plain copy
- if (convertView == null) {
- ....
- class MyTextWatcher implements TextWatcher {
- public MyTextWatcher() {}
- @Override
- public void onTextChanged(CharSequence s, int start,
- int before, int count) {
- }
- @Override
- public void beforeTextChanged(CharSequence s, int start,
- int count, int after) {
- }
- @Override
- public void afterTextChanged(Editable s) {
- if (!TextUtils.isEmpty(s.toString())) {
- mData.get(position).put(etValue, s.toString()); //
- Log.i("afterTextChanged", "position" + position);
- }
- }
- }
- mHolder.num.addTextChangedListener(new MyTextWatcher(mHolder));
- }
[java] view plain copy
- 01-27 16:59:40.512: I/afterTextChanged(12344): position0
- 01-27 16:59:40.532: I/afterTextChanged(12344): position1
- 01-27 16:59:40.542: I/afterTextChanged(12344): position2
- 01-27 16:59:40.552: I/afterTextChanged(12344): position3
- 01-27 16:59:42.772: I/afterTextChanged(12344): position4
- 01-27 16:59:43.712: I/afterTextChanged(12344): position0
- 01-27 16:59:44.502: I/afterTextChanged(12344): position1
- 01-27 16:59:45.392: I/afterTextChanged(12344): position2
- 01-27 16:59:46.632: I/afterTextChanged(12344): position3
- 01-27 16:59:47.492: I/afterTextChanged(12344): position4
- 01-27 16:59:47.842: I/afterTextChanged(12344): position0
- 01-27 16:59:49.142: I/afterTextChanged(12344): position1
- 01-27 16:59:51.662: I/afterTextChanged(12344): position2
- 01-27 16:59:52.822: I/afterTextChanged(12344): position3
- 01-27 16:59:53.192: I/afterTextChanged(12344): position4
- 01-27 17:00:06.662: I/afterTextChanged(12344): position0
[java] view plain copy
- //这时代码position肯定是大于4的,假设是5,但mData中位置为5的地方是空值,这就导致第一项和第6项就都被设为1了
- String value = mData.get(position).get(etValue);
- if (!TextUtils.isEmpty(value)) {
- mHolder.num.setText(value);
- } else {
- mHolder.num.setText("1");
- }
[html] view plain copy
- if (convertView == null) {
- ......
- class MyTextWatcher implements TextWatcher {
- public MyTextWatcher(ViewHolder holder) {
- mHolder = holder;
- }
- /**
- * 这里其实是缓存了一屏数目的viewholder, 也就是说一屏能显示10条数据,那么内存中就会有10个viewholder
- * 在这的作用是通过edittext的tag拿到对应的position,用于储存edittext的值
- */
- private ViewHolder mHolder;
- @Override
- public void onTextChanged(CharSequence s, int start,
- int before, int count) {
- }
- @Override
- public void beforeTextChanged(CharSequence s, int start,
- int count, int after) {
- }
- @Override
- public void afterTextChanged(Editable s) {
- if (!TextUtils.isEmpty(s.toString())) {
- //通过tag来取position<strong>
- int position = (Integer) mHolder.num.getTag();strong>
- mData.get(position).put(etValue, s.toString()); //
- Log.i("afterTextChanged", "position" + position);
- }
- }
- }
- mHolder.num.addTextChangedListener(new MyTextWatcher(mHolder));
- convertView.setTag(mHolder);
- else {
- mHolder = (ViewHolder) convertView.getTag();
- //每次用position动态更新edittext的tag
- <strong> mHolder.num.setTag(position);strong>
然后再测试就会发现edittext能够记住内容了。
二、保证在操作加、减按钮的时候,操作的edittext对象是没有错位的
正常监听是这样写
[java] view plain copy
- mHolder.add.setOnClickListener(new OnClickListener() {
- @Override
- public void onClick(View v) {
- strNum = mData.get(position).get(etValue);
- int intnum = Integer.parseInt(strNum);
- intnum++;
- mHolder.num.setText("" + intnum);
- }
- });
点击前去下载Demo
一、问题原因
我们都知道Android中的adapter的view是用了重用机制的,简单地说就是当屏幕中的item占满屏幕以后,我们滑动listview的时候,第一个item退出屏幕,最后一个item进入屏幕
[java] view plain copy
- View getView(final int position, View convertView, ViewGroup parent)
这个缓存机制就是导致问题出现的根本原因。可能有人就说了,只要不用convertview来缓存不就能解决问题了么。对于这样的解决方案,我只能说,能使用这种方案的都是用屁股在思考问题!
二、问题解决
1.上面有两个问题,分别是editText和checkBox,我们先从简单的来,checkbox只需要考虑两种状态就行了,所以就先解决checkBox
首先用enum来标记下选中和未选中这两种状态
[java] view plain copy
- public enum Type {
- Checked, UnCheck;
- }
- private List
list; - private List
typeList = new ArrayList(); - public CartAdapter(Context context, List
list) { - this.list = list;
- this.context = context;
- initData();
- }
- private void initData() {
- for (CartBean cartBean : list) {
- Type type = Type.UnCheck;
- typeList.add(type);
- }
[java] view plain copy
- mHolder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
- @Override
- public void onCheckedChanged(CompoundButton buttonView,
- boolean isChecked) {
- if (isChecked) {
- typeList.set(position, Type.Checked);
- } else {
- typeList.set(position, Type.UnCheck);
- }
- }
- });
- f (typeList.get(position) == Type.Checked) {
- mHolder.cb.setChecked(true);
- } else if (typeList.get(position) == Type.UnCheck) {
- mHolder.cb.setChecked(false);
- } else {
- mHolder.cb.setChecked(false);
- }
我就举个例子吧,譬如说我选中了第一个item的checkbox,屏幕能显示10个item,当滑动item的时候,第十一个出来,它重用的第一个item的view,checkbox也是第一个的,监听也是第一个的。那么系统在执行这段代码的时候
[java] view plain copy
- if (typeList.get(position) == Type.Checked) {
- mHolder.cb.setChecked(true);
- } else if (typeList.get(position) == Type.UnCheck) {
- mHolder.cb.setChecked(false);
- } else {
- mHolder.cb.setChecked(false);
- }
就得把这个checkbox的状态从选中改成未选中的状态,这样就会触发监听事件
[java] view plain copy
- public void onCheckedChanged(CompoundButton buttonView,
- boolean isChecked) {
- if (isChecked) {
- typeList.set(position, Type.Checked);
- } else {
- typeList.set(position, Type.UnCheck);
- }
- }
所以为了避免这个问题,每次都必须先注册监听,再根据typelist中存储的状态来设置item是否选中。
checkbox的问题解决了,接下来就是editText的了,这个有点麻烦,大家看我文章开头的图片,我不仅要保存edittext里面的值,还要保证在操作加、减button的时候,操作的edittext对象是正确的,最后还有焦点问题。
2.先说说焦点问题,就是在listview中我们点击editText会发现,软键盘是弹出来了,光标也移到EditText上面了;但是,不管输入什么editText里面都不显示!对于这个,我们可以在Activity里面这么配置
android:windowSoftInputMode="adjustPan",这个就是设置输入法的弹出模式,不挤压布局,输入法会覆盖在布局之上,同时editText也会获得焦点。其实之前editText不能输入也是因为没有焦点的缘故,这样就可以解决问题了。也不需要自己动态的获取editText的焦点了。
这个时候edittext能够输入内容了,接下来就是保存内容和button能操作对位的edittext。
我的做法是把edittext这个对象保存在list中,这样的做法不是很好,因为edittext不能序列化存储,我们没法把它持久化存储,这就造成这个对象容易丢。我们都知道系统在横竖屏切换的时候,Activity会重启或者在应用长时间处于后台的时候,系统会把Activity给清掉,等用户回到应用的时候会再重启Activity,如果我们无法存储状态的话,从用户体验上来说就不是很好。或许可以把这个list放在application中静态存储,就和项目中管理所有Activity的list一样。
还没有说完,下篇文章会有demo。
Android中Adapter中edittext,checkbox记住状态解决方案(二)
更多相关文章
- Android(安卓)ListView内部组件事件响应
- Android(安卓)之 Notification
- Android入门扫盲之一
- android selector
- 浅谈android的selector背景选择器
- Android(安卓)打开本地pdf文件,android 加载pdf文件
- Android的selector,背景选择器
- 当忘记Android发布签名和别名的时候
- android GrantPermissionsActivity 详解