动画ListView的标题给出ClassCastException

时间:2011-12-01 09:23:43

标签: android listview animation

我有listview存储人的通信历史。我在listview中有一个标题,它充当带有编辑文本和发送按钮的消息编辑器。 当用户键入内容并按发送按钮时,消息将添加到通信列表中,编辑器将变为空。

我想要的是当用户按下发送按钮时,编辑器应该变为不可见,并且应该将项目添加到列表视图中。之后,编辑应该逐渐从顶部开始,让人感觉它会移动下面的项目。

我已经在标题上实现了一个翻译动画,但它的作用是通过向下推动项目然后逐渐填充我不想要的空间来为它腾出空间。

我使用了this question中解释的负边距技巧,但它对我不起作用。因为我们不能使用布局参数,其他的AbsListView.LayoutParam用于标题。我尝试设置其他参数,但动画它给我ClassCastException。我跟踪了异常,并且由于在ListView中编写的代码,他们试图在clearRecycledState()方法中使用AbsListView.LayoutParams来编译这些参数。

或者是否有办法在listview-header上应用支持边距的布局参数。

代码

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 个答案:

答案 0 :(得分:1)

您是否考虑过另一种方法?也许你可以把编辑器视图放在列表的顶部,但是在屏幕之外,然后使用smoothScrollToPosition进行转换。所以实际上你只是滚动列表,但效果可能是你的正在寻找。