package org.itsnat.droid.impl.xmlinflater.layout; import android.view.View; import org.itsnat.droid.ItsNatDroidException; import java.util.ArrayList; import java.util.List; /** * Created by jmarranz on 6/05/14. */ public abstract class PendingViewPostCreateProcess { protected View view; protected List<Runnable> pendingSetAttribsTaskList; protected List<Runnable> pendingLayoutParamsTasks; protected List<Runnable> pendingPostAddViewTasks; protected boolean destroy = false; public PendingViewPostCreateProcess(View view) { this.view = view; } public void addPendingSetAttribsTask(Runnable task) { if (destroy) throw new ItsNatDroidException("Is already destroyed"); if (pendingSetAttribsTaskList == null) this.pendingSetAttribsTaskList = new ArrayList<Runnable>(); pendingSetAttribsTaskList.add(task); } public void executePendingSetAttribsTasks() { if (destroy) throw new ItsNatDroidException("Is already destroyed"); if (pendingSetAttribsTaskList != null) { for (Runnable task : pendingSetAttribsTaskList) task.run(); this.pendingSetAttribsTaskList = null; } } public void addPendingLayoutParamsTask(Runnable task) { if (destroy) throw new ItsNatDroidException("Is already destroyed"); if (pendingLayoutParamsTasks == null) this.pendingLayoutParamsTasks = new ArrayList<Runnable>(); pendingLayoutParamsTasks.add(task); } public void executePendingLayoutParamsTasks() // Se debe ejecutar antes de que se añada el View al parent { if (destroy) throw new ItsNatDroidException("Is already destroyed"); if (pendingLayoutParamsTasks != null) { for (Runnable task : pendingLayoutParamsTasks) task.run(); onChangedLayoutParams(view); this.pendingLayoutParamsTasks = null; } } public void addPendingPostAddViewTask(Runnable task) { if (destroy) throw new ItsNatDroidException("Is already destroyed"); if (pendingPostAddViewTasks == null) this.pendingPostAddViewTasks = new ArrayList<Runnable>(); pendingPostAddViewTasks.add(task); } public void executePendingPostAddViewTasks() { if (destroy) throw new ItsNatDroidException("Is already destroyed"); if (pendingPostAddViewTasks != null) { for (Runnable task : pendingPostAddViewTasks) task.run(); this.pendingPostAddViewTasks = null; } } public static void onChangedLayoutParams(View view) { // Para que los cambios que se han hecho en los objetos "stand-alone" (ya renderizados) *.LayoutParams se entere el View asociado (esa llamada hace poco más que un requestLayout()), al hacerlo al final evitamos múltiples llamadas por cada cambio en LayoutParams view.setLayoutParams(view.getLayoutParams()); } public void destroy() { this.destroy = true; } }