[lottery] 02_内容部分显示管理(一)——应对重复点击

Android 4.0

内容部分显示管理(一)——应对重复点击

一、用户频繁点击涉及到的问题
①每次点击都会创建目标界面:TopTitleManager
@Override
public void onClick(View v) {
    LogUtil.i(TAG"返回按钮~~~");
    SecondView secondView = new SecondView(topCommonTitle.getContext());
    UIManager.getUiManager().changeView(secondView);
} 
分析:用户每次点击返回,都会有一个SecondView创建
解决:在UIManager中创建一个Map集合,key为某一个BaseView子类的simpleName,value为BaseView的子类
每创建一个BaseView,那么就将其加入到Map集合中,在下次changeView的时候,判断要切换的BaseView是否
在Map集合中存在,如果存在,那么取出,没有的话,创建,然后加入到该集合中去。
判断:输出对象的hashCode()进行判断,如果每次点击都相同,那么解决问题。
②每次切换没有进行界面的判断,当前如果正在显示第二个界面,仍然进行界面的切换
 UIManager的changeView中
解决:定义一个BaseView变量currentView记住当前显示的BaseView,如果当前要切换的是当前的BaseView,
那么不进行操作,终止代码的执行return,
注意:第一次currentView为null,注意进行判空,结束将当前的currentView更新为最新的
 
③每次调用getView 时候都会重新生成(没有变动的界面)
SecondView 中getView()
解决:由于SecondeView是BaseView的子类,在第①步中就将第一次生成的就保存到Map集合了,
所以只需要将SecondView的创建在SecondView的构造方法中执行一次就可以了,以后就不会多次执行了。
1、控制界面管理类的对象创建,多次点击不重复创建对象
①控制界面对象的创建,将对象创建的工作转移到changeView方法中
②利用map缓存当前创建的对象,键为BaseView子类的简单simpleClassname名称,值为当前创建的对象
③利用map的缓存判断当前对象是否已经被创建
2、缓存当前界面管理类信息,多次点击不进行界面切换
①缓存当前页面(当前正显示给用户的界面),当用户频繁点击时只需要比对切换的目标界面和当前界面是否相同即可。
二、 核心代码:
1、解决了每次点击都会创建目标界面的类
/**
 * 5、界面切换(解决了每次点击都会创建目标界面的类)
 * @param clazz
 */
public void changeView2(Class<? extends BaseView> clazz){
    
    String className = clazz.getSimpleName();
    BaseView baseView = null;
    if (map.containsKey(className)) {// map集合中有这个key
        baseView = map.get(className);
    } else {
        try {
            Constructor<? extends BaseView> constructor = clazz.getConstructor(Context.class);
            baseView = constructor.newInstance(getContext());
            map.put(className, baseView);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    LogUtil.i(TAG, baseView.toString());
    View view = baseView.getView();
    rlCenterContentContainer.addView(view);
    
    Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.za_view_translate_in);
    view.startAnimation(animation);
}
调用:
UIManager.getUiManager().changeView(SecondView.class);
2、解决了每次切换没有进行界面的判断,当前如果正在显示第二个界面,仍然进行界面的切换
/**
 * 6、界面切换(解决了每次切换没有进行界面的判断,当前如果正在显示第二个界面,仍然进行界面的切换
 * 
 * @param clazz
 */
private Map<String, BaseView> map = new HashMap<String, BaseView>();
private BaseView currentBaseView;// 当前显示的界面类
public void changeView(Class<? extends BaseView> clazz){
    
    // 1、如果当前的currentBaseView不为null且和待切换的界面类的字节码一直,那么是同一个界面,不切换
    if (currentBaseView!=null && clazz == currentBaseView.getClass()) {
        return;
    }
    
    String className = clazz.getSimpleName();
    BaseView baseView = null;
    if (map.containsKey(className)) {// map集合中有这个key,那么直接取出
        baseView = map.get(className);
    } else {// 如果不存在,利用反射给new该对象
        try {
            Constructor<? extends BaseView> constructor = clazz.getConstructor(Context.class);
            baseView = constructor.newInstance(getContext());
            // 2、 然后记住当前BaseView
            currentBaseView = baseView;
            map.put(className, baseView);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    LogUtil.i(TAG, baseView.toString());
    View view = baseView.getView();
    rlCenterContentContainer.addView(view);
    
    Animation animation = AnimationUtils.loadAnimation(getContext(), R.anim.za_view_translate_in);
    view.startAnimation(animation);
    
}
3、每次调用getView 时候都会重新生成
public class SecondView extends BaseView {
    private TextView tv;
    public SecondView(Context context) {
        super(context);
        init();
    }
    public void init() {
        tv = new TextView(context);
        //LayoutParams params = tv.getLayoutParams();
        LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);//-1
        tv.setLayoutParams(params);
        tv.setText("我是第二个TextView");
        tv.setBackgroundColor(Color.RED);
    }
    @Override
    public View getView() {
        return tv;
    }
}