通用模板

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);
        }
    }
    
}


2.EditText的TextWatcher

被限制的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;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值