2011-12-01 11 views
6

Ho una lista che memorizza la cronologia delle comunicazioni di una persona. Ho una intestazione all'interno di una listview che funge da editor di messaggi con un testo di modifica e un pulsante di invio. Quando un utente digita qualcosa e preme il pulsante di invio, i messaggi vengono aggiunti all'elenco delle comunicazioni e l'editor diventa vuoto.Animazione di intestazioni di una ListView che fornisce ClassCastException

Quello che voglio è quando l'utente preme il pulsante di invio, l'editor dovrebbe diventare invisibile e l'elemento dovrebbe essere aggiunto al listview. Dopo che l'editor dovrebbe venire gradualmente dalla parte superiore dando la sensazione che il suo spostamento degli elementi di seguito.

Ho implementato un'animazione di traduzione sull'intestazione, ma ciò che fa è che rende lo spazio per esso spingendo gli elementi verso il basso e quindi riempie gradualmente lo spazio che non desidero.

Ho usato il trucco margine negativo che è spiegato in this question ma non ha funzionato per me. Poiché non possiamo utilizzare i parametri di layout diversi da AbsListView.LayoutParam per le intestazioni. Ho provato a impostare altri parametri ma durante l'animazione mi ha dato ClassCastException. Ho rintracciato l'eccezione e, a causa del codice scritto all'interno di ListView, stanno cercando di trasmettere questi parametri con AbsListView.LayoutParams all'interno del metodo clearRecycledState().

Oppure c'è un modo per applicare i parametri di layout che supportano il margine su un listview-header.

il codice

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. 
} 

heres il codice di editor di messaggio

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

Puoi pubblicare il tuo file di animazione di traduzione in modo che possiamo pensare ad un modo per farlo funzionare? – DallaRosa

+0

Ho modificato la domanda, puoi dare un'occhiata al codice. È una semplice trascrizione dell'animazione che sto facendo qui. – wasaig

+0

stai usando listView.addHeaderView (headerlayout) nel tuo codice? , se si, allora è possibile vedere e distinguere il layout dell'intestazione in base agli eventi del pulsante di invio – bindal

risposta

1

Avete pensato a un approccio diverso, invece? Forse puoi semplicemente mettere la vista dell'editor in cima alla lista, ma fuori dallo schermo, e quindi usare lo smoothScrollToPosition per entrare. Quindi in realtà stai semplicemente scorrendo la lista, ma l'effetto potrebbe essere quello che stai cercando .

Problemi correlati