Анимация заголовков ListView, дающая ClassCastException - PullRequest
6 голосов
/ 01 декабря 2011

У меня есть просмотр списка, в котором хранится история общения человека. У меня есть один заголовок внутри списка, который действует как редактор сообщений с текстом редактирования и кнопкой отправки. Когда пользователь что-то печатает и нажимает кнопку отправки, сообщения добавляются в список сообщений, и редактор становится пустым.

То, что я хочу, это когда пользователь нажимает кнопку отправки, редактор должен стать невидимым, а пункт должен быть добавлен в список. После этого редактор должен постепенно выходить сверху, создавая ощущение, что он перемещает элементы ниже.

Я реализовал анимацию перевода в заголовке, но он создает пространство для него, нажимая элементы вниз, а затем постепенно заполняет пространство, которое мне не нужно.

Я использовал трюк с отрицательной маржой, который объясняется в этом вопросе , но у меня это не сработало. Поскольку мы не можем использовать параметры макета, отличные от 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);
    }
}
}

1 Ответ

1 голос
/ 10 декабря 2011

Думали ли вы о другом подходе?Может быть, вы можете просто поместить представление редактора вверху списка, но за пределами экрана, а затем использовать smoothScrollToPosition для перехода внутрь. Так что в действительности вы просто прокручиваете список, но эффект может бытьчто вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...