2013-06-09 3 views
1

То, что я пытаюсь достичь автоматически прокрутки в нижней части Scrollview, когда новый вид добавляется через:Alernative методу postDelayed в ScrollView

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, заключается в том, что без задержки новый вид не нарисован достаточно быстро, и я заканчиваю прокрутку на нижнюю границу минус высота новой записи. Я знаю, что это так, потому что если я сброшу время задержки, например, на 100 мс, прокрутка закончится тем, что закончится примерно на треть пути вниз по новой записи. После проб и ошибок с разными значениями 300 мс было число, которое дало мне желаемый результат.

Есть ли лучший способ достичь этого? - В настоящее время мой метод работает, но он не кажется самым чистым вариантом.

Я все еще относительно новое для программирования Android/Java, так что я, уверен, что я мог бы что-то пропустил где-то ...

Я должен упомянуть, я также попытался fullScroll (View.FOCUS_DOWN) также, без каких-либо изменение поведения. Я поменял его на вариант smoothScroll, потому что я предпочел более плавную анимацию.

+0

«Я знаю, что это так, потому что если я сброшу время задержки, например, на 100 мс, прокрутка закончится тем, что закончится примерно на треть пути вниз по новой записи» - это не делает много смысл. Это не похоже на то, что размер новой записи увеличивается на один пиксель за раз. «Я все еще относительно новичок в программировании на базе Android/Java» - какова ваша общая цель пользовательского интерфейса? 'ScrollView' не является злом, но это относительно необычный выбор, и могут быть лучшие варианты (например,' ListView' в режиме транскрипции). – CommonsWare

+0

У меня есть RelativeLayout, прикрепленный к нижней части моей Activity, который имеет edittext для ввода пользователем и кнопку для отправки этого ввода. При нажатии кнопки будет обновлен «список» в соответствии с моим кодом выше. Может ли список и listadapter стать лучшим вариантом? Я в основном следил за учебником и подстраивал его под мои потребности, хотя в прошлом у меня был опыт работы с ListFragments и адаптерами. – Karl

ответ

1

Может ли вариант listview и listadapter стать лучшим вариантом?

Это была бы моя рекомендация. В частности, ListView имеет так называемый «режим транскрипции», который можно использовать для автоматического прокрутки вниз, когда вы добавляете новые записи, например, ArrayAdapter. Большее преимущество над ScrollView - помимо работы с «транскрипционным режимом» - это переработка вида, поэтому многие обновления не пережевывают много кучи в вашем приложении.

В ListFragment, вы должны выполнить что-то вроде этого, чтобы включить режим расшифровку:

getListView().setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL); 

вероятно (хотя и не обязательно), где бы вы создали свой ListAdapter.

Если ваш адаптер является ArrayAdapter<SomethingFun>, вы можете просто позвонить add() на ArrayAdapter добавлять новые модели, и они будут автоматически отображаться в нижней части ListView. В режиме «нормального» транскрипта пользователь увидит новые записи, если только они не прокручиваются, чтобы просмотреть некоторую историю, и в этом случае положение прокрутки остается в покое. IOW, что вы обычно видите в приложении для чата.

+0

Спасибо.Я реализовал рабочее решение, используя пользовательский адаптер и ListView. @CommonsWare – Karl

Смежные вопросы