2012-02-06 50 views
6

Tôi có một ScrollView với LinearLayout bên trong một Tôi đang thêm TextViews. Nhưng tôi luôn muốn TextView được thêm vào cuối cùng được hiển thị, vì vậy tôi cần ScrollView để cuộn xuống dưới cùng, khi một TextView được thêm vào. Tôi không biết tại sao, nhưng khi tôi gọi scrollto(), scrollby() hoặc fullScroll() sau khi thêm một lần xem văn bản, nó chỉ cuộn đến chế độ xem văn bản trước khung nhìn cuối cùng.Làm thế nào để giữ một ScrollView được cuộn xuống dưới cùng?

Bạn có biết cách tốt hơn để làm điều này không?

Cảm ơn rất nhiều!

Code:

Tôi có một Button, trong đó kêu gọi chức năng này:

private void addRound() { 
    // TODO Auto-generated method stub 
    TextView newRound = new TextView(Stopwatch.this); 
    newRound.setText("" + counter + ". - " + timerText()); 
    newRound.setTextSize(20); 
    newRound.setGravity(Gravity.CENTER); 
    linlay.addView(newRound); 
    counter++; 
} 

Sau khi gọi hàm này tôi gọi fullScroll().

addRound(); 
sv.fullScroll(View.FOCUS_DOWN); 

sv ist my ScrollView, linlay là linearlayout bên trong scrollview.

+0

bạn có lẽ nên sử dụng ListView cho mục đích này và sử dụng list.setSelection (int index); dễ dàng. –

+0

Tôi có thể thu nhỏ một ListView chỉ là một phần của bố cục không? – TheBrillowable

+1

Chúng tôi có thể thấy mã bạn đang sử dụng để xác định nơi cuộn đến và thực sự cuộn ScrollView? –

Trả lời

11

Tôi nghĩ đó là vì scrollview không khá được cập nhật theo thời gian bạn gọi sv.scrollFull(View.FOCUS_DOWN); Hãy thử như sau (để thay thế mẫu mã thứ hai của bạn):

addRound(); 
sv.post(new Runnable() { 

    @Override 
    public void run() { 
    sv.fullScroll(View.FOCUS_DOWN); 
    } 
}); 

Nếu ở trên không hoạt động, hãy thử như sau (nó không phải là một cách thanh lịch để làm điều đó nhưng nó có thể làm việc):

addRound(); 
sv.postDelayed(new Runnable() { 

    @Override 
    public void run() { 
    sv.fullScroll(View.FOCUS_DOWN); 
    } 
}, 100); 

Hy vọng công trình này!

+0

Tùy chọn đầu tiên hoạt động tốt với hiệu quả đáng kể không đáng kể, cảm ơn rất nhiều! – TheBrillowable

+0

Chưa cập nhật. Đó là nó! Cuối cùng đã giải quyết được vấn đề của tôi. Không cần postDelayed, bài bình thường là đủ. – Michel

+0

Cảm ơn bạn, mã postDelayed luôn làm việc cho tôi, mã đầu tiên chỉ hoạt động đôi khi. – user3560827

0

Một cách tiếp cận khác là sử dụng ViewTreeObserver.OnGlobalLayoutListener. Thêm đoạn mã này vào phương thức onCreate().

linlay.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      sv.fullScroll(View.FOCUS_DOWN); 
     } 
    }); 
Các vấn đề liên quan