1.ListView和GridView的Adapter
自定义的BaseAdapter类
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
/**
* 基类adapter
*
*/
public abstract class BaseAdapter<T> extends android.widget.BaseAdapter {
protected Context context;
protected List<T> list = null;
List<BaseAdapter.ViewHolder<T>> holders = new ArrayList<BaseAdapter.ViewHolder<T>>();
public BaseAdapter(Context context, List<T> list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list != null ? list.size() : 0;
}
@Override
public Object getItem(int position) {
return list != null && position >= 0 && position < list.size() ? list
.get(position) : null;
}
@Override
public long getItemId(int position) {
return position;
}
@SuppressWarnings("unchecked")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder<T> holder;
if (convertView == null) {
convertView = createView(context, parent);
holder = createViewHolder();
convertView.setTag(holder);
holder.init(context, convertView);
holders.add(holder);
}
else {
holder = (ViewHolder<T>) convertView.getTag();
}
T data = list.get(position);
holder.position = position;
holder.update(context, data);
return convertView;
}
public abstract View createView(Context context, ViewGroup parent);
public abstract ViewHolder<T> createViewHolder();
/**
* 保存当前Item的view
*/
public static abstract class ViewHolder<T> {
public int position;
public abstract void init(Context context, View convertView);
public abstract void update(Context context, T data);
}
}
用法TestAdapter
import java.util.List;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
public class TestAdapter extends BaseAdapter<String> {
public TestAdapter(Context context, List<String> list) {
super(context, list);
}
@Override
public View createView(Context context, ViewGroup parent) {
return new TextView(context);
}
@Override
public BaseAdapter.ViewHolder<String> createViewHolder() {
return new TestHolder();
}
public static class TestHolder extends BaseAdapter.ViewHolder<String> {
public TextView testText;
@Override
public void init(Context context, View convertView) {
testText = (TextView) convertView;
// textText = (TextView) findViewById(R.id.test_tv);
}
@Override
public void update(Context context, String data) {
testText.setText(data);
}
}
}
被限制的LimitedTextWatcher,如长度等
import android.text.Editable;
import android.text.Selection;
import android.text.TextWatcher;
/**
* 受限制Text监听,长度以及是否表情
*
*/
public class LimitedTextWatcher implements TextWatcher {
protected int changedCount;
protected int maxLength;
protected boolean allowEmoji = true;
CharSequence tips;
public LimitedTextWatcher(int maxLength, boolean allowEmoji, CharSequence tips) {
this.maxLength = maxLength;
this.allowEmoji = allowEmoji;
this.tips = tips;
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
changedCount = count;
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
changedCount = count;
}
@Override
public void afterTextChanged(Editable s) {
if (s != null) {
int length = s.length();
if (!allowEmoji && changedCount >= 2 && length >= changedCount) {
CharSequence input = s.subSequence(length - changedCount, length);
if (EmojiUtil.containsEmoji(input.toString())) {
s.delete(length - changedCount, length);
Selection.setSelection(s, s.length());
// 输入表情的提示tips
}
}
else if (length > maxLength) {
s.delete(maxLength, length);
Selection.setSelection(s, s.length());
// 输入超过限制的提示tips
}
}
}
}
3.activity的管理
ActivityStack
import java.lang.ref.WeakReference;
import java.util.Stack;
import android.app.Activity;
public abstract class ActivityStack {
private static Stack<WeakReference<Activity>> activityStack = new Stack<WeakReference<Activity>>();
/**
* 返回栈大小
*
* @return
*/
public static int size() {
return activityStack.size();
}
/**
* 返回栈顶项
*
* @return
*/
public static Activity getFront() {
if (activityStack.size() > 0) {
return activityStack.get(0).get();
}
return null;
}
/**
* 当前栈顶项出栈
*/
public static void popCurrent() {
WeakReference<Activity> activity = topActivity();
popActivity(activity);
}
/**
* 指定项以上的栈顶所有项出栈
*
* @param currentActivity
* 指定项
*/
public static void popFront(Class<? extends Activity> currentActivity) {
while (true) {
WeakReference<Activity> activity = topActivity();
if (activity != null && !activity.getClass().equals(currentActivity)) {
popActivity(activity);
}
else {
break;
}
}
}
/**
* 除栈底项外的所有项出栈
*/
public static void popAllFront() {
while (true) {
if (activityStack.size() > 1) {
popCurrent();
}
else {
break;
}
}
}
/**
* 指定项以下的栈底所有项出栈
*
* @param currentActivity
* 指定项
*/
public static void popEnd(Activity currentActivity) {
while (true) {
WeakReference<Activity> activity = bottomActivity();
if (activity == null || activity.get() == currentActivity) {
break;
}
popActivity(activity);
}
}
/**
* 所有项出栈
*/
public static void popAll() {
for (int i = 0, size = activityStack.size(); i < size; i++) {
if (activityStack.get(i) != null) {
Activity activity = activityStack.get(i).get();
if (activity != null) {
activity.finish();
}
}
}
activityStack.clear();
}
/**
* 新项入栈
*
* @param activity
*/
public static void pushActivity(Activity activity) {
activityStack.add(new WeakReference<Activity>(activity));
}
/**
* 指定项出栈
*
* @param activity
*/
public static void popActivity(WeakReference<Activity> activity) {
if (activity != null) {
if (activity.get() != null) {
activity.get().finish();
}
activityStack.remove(activity);
activity = null;
}
}
/**
* 返回栈顶项
*
* @return
*/
public static WeakReference<Activity> topActivity() {
if (activityStack.size() > 0) {
return activityStack.lastElement();
}
return null;
}
/**
* 返回栈底项
*
* @return
*/
public static WeakReference<Activity> bottomActivity() {
if (activityStack.size() > 0) {
return activityStack.firstElement();
}
return null;
}
}