2011-12-01 36 views
6

Tôi có listview lưu trữ lịch sử giao tiếp của một người. Tôi có một tiêu đề bên trong một listview hoạt động như một trình soạn thảo tin nhắn với một văn bản chỉnh sửa và một nút gửi. Khi người dùng nhập nội dung nào đó và nhấn nút gửi thì tin nhắn thêm vào danh sách liên lạc và trình chỉnh sửa sẽ trống.Đầu đề hoạt ảnh của một ListView cho ClassCastException

Điều tôi muốn là khi người dùng nhấn nút gửi, trình chỉnh sửa sẽ trở thành vô hình và Mục phải được thêm vào chế độ xem danh sách. Sau đó, người biên tập nên dần dần từ đầu cho cảm giác rằng nó di chuyển các mục bên dưới.

Tôi đã triển khai một hoạt ảnh dịch trên tiêu đề nhưng nó làm nó làm cho không gian cho nó bằng cách đẩy các mục xuống và sau đó dần dần lấp đầy không gian mà tôi không muốn.

Tôi đã sử dụng mẹo ký quỹ âm được giải thích trong this question nhưng không hiệu quả đối với tôi. Vì chúng tôi không thể sử dụng các tham số bố cục khác mà AbsListView.LayoutParam cho các tiêu đề. Tôi đã thử thiết lập params khác nhưng trong khi hoạt hình Nó mang lại cho tôi ClassCastException. Tôi theo dõi các ngoại lệ và do mã của nó được viết bên trong ListView họ đang cố gắng để đúc các params với AbsListView.LayoutParams bên trong phương thức clearRecycledState().

Hoặc Có cách nào áp dụng các tham số bố cục hỗ trợ lề trên tiêu đề listview hay không.

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

heres mã của biên tập viên tin

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

Bạn có thể đăng tệp hoạt hình dịch của mình để chúng tôi có thể nghĩ ra cách để làm cho nó hoạt động không? – DallaRosa

+0

Tôi đã chỉnh sửa câu hỏi, bạn có thể xem mã. Đó là một hoạt hình dịch đơn giản mà tôi đang làm ở đây. – wasaig

+0

bạn đang sử dụng listView.addHeaderView (headerlayout) trong mã của bạn? , nếu yeas thì bạn có thể nhìn thấy và nhìn thấy được bố trí tiêu đề của bạn dựa trên các sự kiện nút gửi của bạn – bindal

Trả lời

1

Bạn đã nghĩ về một cách tiếp cận khác nhau để thay thế? Có thể bạn chỉ cần đặt chế độ xem trình chỉnh sửa ở đầu danh sách, nhưng bên ngoài màn hình và sau đó sử dụng smoothScrollToPosition để chuyển đổi. Vì vậy, trong thực tế, bạn chỉ cần cuộn danh sách, nhưng hiệu ứng có thể là thứ bạn đang tìm kiếm .

Các vấn đề liên quan