2011-12-01 9 views
6

Tengo listview que almacena el historial de comunicación de una persona. Tengo un encabezado dentro de una vista de lista que actúa como editor de mensajes con un texto de edición y un botón de enviar. Cuando un usuario escribe algo y presiona el botón enviar, los mensajes se agregan a la lista de comunicación y el editor se vacía.Animar encabezados de un ListView dando ClassCastException

Lo que deseo es que cuando el usuario presione el botón de enviar, el editor se vuelva invisible y el ítem se agregue a la vista de lista. Después de eso, el editor debería aparecer gradualmente desde la parte superior, dando la sensación de que está moviendo los elementos a continuación.

He implementado una animación de traducción en el encabezado, pero lo que hace es que crea el espacio para ello empujando los elementos hacia abajo y luego llena gradualmente el espacio que no quiero.

Utilicé el truco de margen negativo que se explica en this question pero no funcionó para mí. Como no podemos usar parámetros de diseño distintos a AbsListView.LayoutParam para los encabezados. Intenté configurar Otros params pero al animar Me da ClassCastException. Seguí la excepción y es debido al código escrito dentro de ListView que están tratando de lanzar estos parámetros con AbsListView.LayoutParams dentro del método clearRecycledState().

O ¿Hay alguna manera de aplicar los parámetros de diseño que admiten margen en un encabezado listview.

el código

public class PageListView extends ListView { 
    private Application app; 
    private CommListAdapter listAdapter; 
    private MessageEditorHeader messageEditorHeader; 
    private MessageItemLongClick mInterface; 
    private Handler handler; 

public ProfilePageListView(Application app, MessageItemLongClick mInterface) { 
    super(app); 
    this.app = app; 
    this.mInterface = mInterface; 
    this.handler = new Handler(); 
    setupView(); 
} 

public void applyData(ProfileData data){ 

    listAdapter.applyData(data.getUser()); 
    // some other business logic   
} 

private void setupView() { 

    messageEditorHeader = new MessageEditorHeader(app); 
    addHeaderView(messageEditorHeader); 

    listAdapter = new CommListAdapter(app, mInterface); 
    setAdapter(listAdapter); 
    setDivider(null); 
    setScrollingCacheEnabled(false); 

    tAnimation = new TranslateAnimation(0.0f, 0.0f, -90.0f, 0.0f); 
    tAnimation.setZAdjustment(-1); 
    tAnimation.setDuration(1500); 
} 

// this gets called whenever the communication gets added to the listview. 
public void onNewCommunication(Communication lc) { 
    listAdapter.onNewCommunication(); 

    if(lc != null && lc.isOutgoing() && !lc.getType().isCall()){    
     getMessageEditor().startNewMessage(); 
     messageEditorHeader.setVisibility(VISIBLE); // this is overriden method here I m toggling the height 1px and WRAP_CONTENT 
     messageEditorHeader.startAnimation(tAnimation); 
    } 
} 

// few more methods are there. 
} 

aquí está el código del editor de mensajes

public class MessageEditorHeader extends RelativeLayout { 
private MessageEditor msgEditor; 

public MessageEditorHeader(AppteraApplication context) { 
    super(context); 
    msgEditor = new MessageEditor(context); // Its a relative layout containing edit text and the send button 
    addView(msgEditor); 
} 

public MessageEditor getMsgEditor() { 
    return msgEditor; 
} 

public void setProgress(int progress){ 
    msgEditor.setProgress(progress); 
} 

@Override 
public void setVisibility(int visibility) { 
    this.visibility = visibility; 
    if (visibility == View.VISIBLE) { 
     ListView.LayoutParams params = new ListView.LayoutParams(ListView.LayoutParams.FILL_PARENT, ListView.LayoutParams.WRAP_CONTENT); 
     setLayoutParams(params); 
    } 
    else { 
     ListView.LayoutParams params = new ListView.LayoutParams(ListView.LayoutParams.FILL_PARENT, 1); 
     setLayoutParams(params); 
    } 
} 
} 
+0

¿Puedes publicar tu archivo de animación de traducción para que podamos pensar en una forma de hacerlo funcionar? – DallaRosa

+0

He editado la pregunta, puede echarle un vistazo al código. Es una simple animación de traducción que estoy haciendo aquí. – wasaig

+0

¿está utilizando listView.addHeaderView (headerlayout) en su código? , si lo hace, puede ver visible y visible su diseño de encabezado en función de los eventos del botón de envío – bindal

Respuesta

1

¿Ha pensado en un enfoque diferente en su lugar? Tal vez solo puede poner la vista del editor en la parte superior de la lista, pero fuera de la pantalla, y luego usar smoothScrollToPosition para hacer la transición. Entonces, en realidad solo está desplazándose por la lista, pero el efecto podría ser lo que está buscando. .