У меня есть просмотр списка, в котором хранится история общения человека. У меня есть один заголовок внутри списка, который действует как редактор сообщений с текстом редактирования и кнопкой отправки.
Когда пользователь что-то печатает и нажимает кнопку отправки, сообщения добавляются в список сообщений, и редактор становится пустым.
То, что я хочу, это когда пользователь нажимает кнопку отправки, редактор должен стать невидимым, а пункт должен быть добавлен в список. После этого редактор должен постепенно выходить сверху, создавая ощущение, что он перемещает элементы ниже.
Я реализовал анимацию перевода в заголовке, но он создает пространство для него, нажимая элементы вниз, а затем постепенно заполняет пространство, которое мне не нужно.
Я использовал трюк с отрицательной маржой, который объясняется в этом вопросе , но у меня это не сработало. Поскольку мы не можем использовать параметры макета, отличные от AbsListView.LayoutParam для заголовков. Я попытался установить другие параметры, но при анимации это дает мне ClassCastException. Я отслеживал исключение, и из-за кода, написанного внутри ListView, они пытаются преобразовать эти параметры с помощью AbsListView.LayoutParams внутри метода clearRecycledState ().
Или есть ли способ применить параметры макета, которые поддерживают поля в заголовке списка.
код
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.
}
вот код редактора сообщений
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);
}
}
}