8

Tôi có RecyclerView với Chế độ xem con có thể mở rộng, khi ViewGroup con được nhấp vào nó làm tăng lượng lượt xem làm tăng chiều cao ViewGroup từ 0 đến chiều cao viewgroup đo được, như gif sau :Android RecyclerView cuộn mượt mà để xem hình động đó có chiều cao của chúng

example

vấn đề là: tôi gọi smoothScrollToPosition trên recyclerView, nó trơn tru di chuyển đến vị trí xem, nhưng nó coi chiều cao xem hiện tại, mà vẫn chưa được mở rộng, trong gif trên i' m chạm vào dưới xem của recyclerview, mà không di chuyển đến vị trí vì xem đã được nhìn thấy, nhưng khi tôi chạm một lần nữa (gọi mịn scrolltoposition một lần nữa) nó di chuyển khung nhìn đến đúng vị trí, vì khung nhìn đã được mở rộng.

Có phương pháp nào để di chuyển chế độ xem để phía trên cùng của màn hình hoặc chỉ cần di chuyển để làm cho nội dung hiển thị?

Đối với tài liệu tham khảo: Đây là phương pháp được gọi là để thổi phồng các quan điểm:

collapsible_content.removeAllViews(); 
for(int i = 0; i < 5; i++) { 
     View link_view = getLayoutInflater().inflate(R.layout.list_item_timeline_step_link, collapsible_content, false); 
     TextView text = (TextView) link_view.findViewById(R.id.step_link_text); 
     text.setText("Test"); 
     collapsible_content.addView(link_view); 
    } 

Và đây là phương pháp của tôi để mở rộng:

public void toggle() { 
     collapsible_content.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
     Animation a; 
     if (mExpanded) { 
      a = new ExpandAnimation(collapsible_content.getLayoutParams().height, 0); 
     } else { 
      a = new ExpandAnimation(collapsible_content.getLayoutParams().height, getMeasuredHeight()); 
     } 
     a.setDuration(mAnimationDuration); 
     collapsible_content.startAnimation(a); 
     mExpanded = !mExpanded; 
    } 

Và các hình ảnh động:

private class ExpandAnimation extends Animation { 
     private final int mStartHeight; 
     private final int mDeltaHeight; 

     public ExpandAnimation(int startHeight, int endHeight) { 
      mStartHeight = startHeight; 
      mDeltaHeight = endHeight - startHeight; 
     } 

     @Override 
     protected void applyTransformation(float interpolatedTime, 
              Transformation t) { 
      final int newHeight = (int) (mStartHeight + mDeltaHeight * 
        interpolatedTime); 
      collapsible_content getLayoutParams().height = newHeight; 

      if (newHeight <= 0) { 
       collapsible_content setVisibility(View.GONE); 
      } else { 
       collapsible_content setVisibility(View.VISIBLE); 
      } 
      collapsible_content requestLayout(); 
     } 


     @Override 
     public boolean willChangeBounds() { 
      return true; 
     } 
    } 

Trả lời

7

giải pháp của tôi là kiểm tra thường xuyên để xem đáy trong phương pháp applyTransformation, và so sánh nó với RecyclerView chiều cao, nếu phía dưới có được cao hơn so với chiều cao RV, tôi di chuyển bởi các giá trị khác:

final int bottom = collapsible_content.getBottom(); 
final int listViewHeight = mRecyclerView.getHeight(); 
if (bottom > listViewHeight) { 
    final int top = collapsible_content.getTop(); 
    if (top > 0) { 
     mRecyclerView.smoothScrollBy(0, Math.min(bottom - listViewHeight + mRecyclerView.getPaddingBottom(), top)); 
    } 
} 

Bí quyết đã sử dụng Math.min để có được đầu xem, vì vậy nó không cuộn lên làm cho phần trên không hiển thị.

Giải pháp dựa trên ListViewAnimations

0

Thêm một trình xử lý hoạt ảnh và bắt đầu cuộn của recyclerview sau khi mở rộng anima tion xong rồi.

+0

Tôi đã làm điều này, nhưng tôi muốn di chuyển trong khi xem được hiệu ứng động, cách tiếp cận của tôi là để nghe thêm một hình ảnh động để kiểm tra xem đáy Y xem là ra khỏi RecyclerView, sau đó gọi smoothscrollby cho giá trị của các điểm ảnh ra, nhưng tôi không quản lý làm thế nào để điều này –

+0

Được rồi vì vậy bạn muốn hình ảnh động bith parallely – Mann

+0

Tôi nghĩ rằng bạn phải "giả" chiều cao của xem để giả vờ một cái nhìn cao hơn – Mann

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