2013-06-09 3 views
1

어떤 새로운보기를 통해 추가 될 때 자동으로있는 ScrollView의 하단으로 스크롤됩니다 달성하기 위해 노력하고있어 :Alernative

: 이것은 내가 현재 가지고있는 코드는

mContainerView.addView(newView); 

bt.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     String input = et.getText().toString(); 
     if (input != null && input.length() > 0) { 
      findViewById(android.R.id.empty).setVisibility(View.GONE); 
      addItem(input); 
      et.setText(null); 
      ScrollToBottom(); 
     } 
    } 
}); 

private void ScrollToBottom() { 
    mScrollView.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      mScrollView.smoothScrollTo(0, mScrollView.getBottom()); 
     } 
    }, 300); 
} 

private void addItem(String name) { 
    final ViewGroup newView = (ViewGroup) LayoutInflater.from(this).inflate(
      R.layout.list_item_example, mContainerView, false); 

    ((TextView) newView.findViewById(android.R.id.text1)).setText(name); 

    newView.findViewById(R.id.delete_button).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      mContainerView.removeView(newView); 

      if (mContainerView.getChildCount() == 0) { 
       findViewById(android.R.id.empty).setVisibility(View.VISIBLE); 
      } 
     } 
    }); 
    mContainerView.addView(newView); 
} 

내가 postDelayed를 사용하는 이유는 지연이 없기 때문에 새로운 뷰가 충분히 빨리 그려지지 않고 아래쪽에서 새 항목의 높이를 뺀 값으로 스크롤되기 때문입니다. 지연 시간을 예를 들어 100ms로 떨어 뜨리면 스크롤이 새 항목 아래로 약 1/3 정도 끝나기 때문에이 경우를 알 수 있습니다. 시행 착오 후 다른 값으로 300ms가 원하는 결과를 얻은 번호입니다.

더 좋은 방법이 있나요? - 현재 내 방법이 작동하지만 가장 깨끗한 옵션으로 보이지 않습니다. 나는 아직도 내가 안드로이드/자바 프로그래밍 비교적 새로운 해요

, 어디 선가 뭔가를 놓친 것 확신 ...

나는 또한 어떤없이, 또한 fullScroll (View.FOCUS_DOWN)을 시도 언급해야한다 행동의 변화. 더 부드러운 애니메이션을 선호했기 때문에 smoothScroll 옵션을 바꿨습니다.

+0

"지연 시간을 예를 들어 100ms로 떨어 뜨리면 스크롤은 새로운 항목 아래로 약 3 분의 1 정도 끝나기 때문에 종료됩니다. 감각. 새 항목의 크기가 한 번에 한 픽셀 씩 증가하는 것과는 다릅니다. "나는 여전히 Android/Java 프로그래밍에 비교적 새로운 기술입니다."- 전반적인 UI 목표는 무엇입니까? 'ScrollView'는 악의가 아니지만 상대적으로 드문 선택이며 더 나은 옵션이있을 수 있습니다 (예 : 스크립트 모드의'ListView '). – CommonsWare

+0

사용자 입력에 대한 edittext와 해당 입력을 '제출'하는 버튼이있는 Activity의 아래쪽에 RelativeLayout이 고정되어 있습니다. 단추를 누르면 위의 코드대로 '목록'이 업데이트됩니다. listview와 listadapter가 더 좋은 옵션이 될 수 있습니까? 나는 기본적으로 자습서를 따랐고 과거에는 ListFragments 및 어댑터에 대한 경험이 있지만 필요에 맞게 조정했습니다. – Karl

답변

1

listview와 listadapter가 더 좋은 옵션일까요?

그건 내 추천입니다. 특히 ListView에는 ArrayAdapter과 같이 새 항목을 추가 할 때 하단으로 자동 스크롤하는 데 사용할 수있는 소위 "스크립트 모드"가 있습니다. ScrollView 이상의 큰 장점은 - "사본 모드"를 다루는 것 외에도보기 재활용이므로 많은 업데이트가 앱의 많은 힙 공간을 씹지 않습니다. ListFragment에서

, 당신은 성적 증명서 모드를 사용하려면이 같은 것을 실행하는 것입니다 :

getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL); 

를 아마와 반드시는 아니지만 당신이 ListAdapter 당신을 설정 곳에서. 어댑터는 ArrayAdapter<SomethingFun> 경우

, 당신은 단지 새로운 모델을 추가 할 수 ArrayAdapteradd()를 호출 할 수 있습니다, 그들은 자동으로 ListView의 하단에 표시됩니다. "보통"스크립트 모드에서는 사용자가 스크롤하여 일부 기록을 보지 않는 한 새 항목이 표시됩니다.이 경우 스크롤 위치는 그대로 있습니다. IOW, 일반적으로 채팅 스타일 앱에서 보는 것.

+0

고맙습니다.사용자 지정 어댑터 및 ListView를 사용하여 작업 솔루션을 구현했습니다. @ CommonSWare – Karl