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);
}
}
}
Czy umieścisz plik animacji tłumaczenia, abyśmy mogli wymyślić sposób, aby to zadziałało? – DallaRosa
Edytowałem pytanie, możesz rzucić okiem na kod. Jest to prosta animacja tłumaczenia, którą tu robię. – wasaig
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