2011-12-01 15 views
6

Mam listview, który przechowuje historię komunikacji osoby. Mam jeden nagłówek wewnątrz listy, która działa jako edytor wiadomości z tekstem edycji i przyciskiem wysyłania. Gdy użytkownik wpisze coś i naciśnie przycisk Wyślij, wiadomości zostaną dodane do listy komunikatów, a edytor zostanie pusty.Animowane nagłówki listView daje ClassCastException

Czego chcę, gdy użytkownik naciśnie przycisk Wyślij, edytor powinien stać się niewidoczny, a element powinien zostać dodany do listy. Następnie redaktor powinien przychodzić stopniowo od góry, dając wrażenie, że porusza przedmioty poniżej.

Zaimplementowałem animację tłumaczenia w nagłówku, ale to, co robi, to tworzy przestrzeń, naciskając elementy, a następnie stopniowo wypełnia przestrzeń, której nie chcę.

Użyłem sztuczki ujemnego marginesu, która jest wyjaśniona w this question, ale nie działa dla mnie. Ponieważ nie możemy używać parametrów układu innych niż AbsListView.LayoutParam dla nagłówków. Próbowałem ustawić Inne parametry, ale podczas animowania To daje mi ClassCastException. Śledziłem wyjątek i jego kod został napisany w ListView, próbując rzucić te parametry za pomocą metody AbsListView.LayoutParams wewnątrz metody clearRecycledState().

Lub Czy istnieje sposób na zastosowanie parametrów układu obsługujących margines na nagłówku listview.

kod

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

herezje kod edytora wiadomości

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

Czy umieścisz plik animacji tłumaczenia, abyśmy mogli wymyślić sposób, aby to zadziałało? – DallaRosa

+0

Edytowałem pytanie, możesz rzucić okiem na kod. Jest to prosta animacja tłumaczenia, którą tu robię. – wasaig

+0

używasz listView.addHeaderView (headerlayout) w swoim kodzie? , jeśli tak, możesz zobaczyć widoczny i widoczny układ nagłówka na podstawie zdarzeń przycisku wysyłania – bindal

Odpowiedz

1

Czy myślałeś o innym podejściu, a nie? Może po prostu umieść widok edytora u góry listy, ale poza ekranem, a następnie użyj smoothScrollToPosition do przejścia. W rzeczywistości po prostu przewijasz listę, ale efekt może być tym, czego szukasz .

Powiązane problemy