Как установить программный палец прокрутки в Android?

Я знаю, что listview может установить большой палец прокрутки в XML, например, Android:scrollbarThumbVertical и т.д.

Но я создаю экземпляр listview в java-коде, и мне, возможно, нужно установить другой палец прокрутки. Можно ли программным способом настроить палец прокрутки?

Ответ 1

Я не знал ответа на этот вопрос, но после небольшого копания я не думаю, что это возможно без нагрузки.

Этот атрибут xml фактически связан с View, а не с ListView. В исходном коде Android View кажется, что единственным местом, где он устанавливает вертикальный вывод большого пальца, является 'initializeScrollbars'. Теперь этот метод не является приватным, поэтому мы можем расширить любой дочерний элемент View и переопределить этот метод, но проблема в том, что решающим компонентом, необходимым для установки большого пальца, является ScrollabilityCache, без каких-либо методов getter.

Поэтому, не переписывая много кода, я не думаю, что есть простой способ сделать это - извините!

Ответ 2

Вы можете достичь этого через отражение:

try
{
    Field mScrollCacheField = View.class.getDeclaredField("mScrollCache");
    mScrollCacheField.setAccessible(true);
    Object mScrollCache = mScrollCacheField.get(listview);
    Field scrollBarField = mScrollCache.getClass().getDeclaredField("scrollBar");
    scrollBarField.setAccessible(true);
    Object scrollBar = scrollBarField.get(mScrollCache);
    Method method = scrollBar.getClass().getDeclaredMethod("setVerticalThumbDrawable", Drawable.class);
    method.setAccessible(true);
    method.invoke(scrollBar, getResources().getDrawable(R.drawable.scrollbar_style));
}
catch(Exception e)
{
    e.printStackTrace();
}

Вышеупомянутый код выполняется как:

listview.mScrollCache.scrollBar.setVerticalThumbDrawable(getResources().getDrawable(R.drawable.scrollbar_style));

Ответ 3

Я изменил ответ, чтобы сделать его методом на 100% программным путем

   public static void ChangeColorScrollBar(View Scroll, int Color, Context cxt){

   try
   {
       Field mScrollCacheField = View.class.getDeclaredField("mScrollCache");
       mScrollCacheField.setAccessible(true);
       Object mScrollCache = mScrollCacheField.get(Scroll);
       Field scrollBarField = mScrollCache.getClass().getDeclaredField("scrollBar");
       scrollBarField.setAccessible(true);
       Object scrollBar = scrollBarField.get(mScrollCache);
       Method method = scrollBar.getClass().getDeclaredMethod("setVerticalThumbDrawable", Drawable.class);
       method.setAccessible(true);

       Drawable[] layers = new Drawable[1];
       ShapeDrawable sd1 = new ShapeDrawable(new RectShape());
       sd1.getPaint().setColor(cxt.getResources().getColor(Color));
       sd1.setIntrinsicWidth(Math.round(cxt.getResources().getDimension(R.dimen.dp_3)));
       layers[0] = sd1;

       method.invoke(scrollBar, layers);
   }
   catch(Exception e)
   {
       e.printStackTrace();
   }

}