再現させるコード。
public class TestActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ListView lv = new ListView(this); setContentView(lv); ArrayAdapter<String> adapter = new ArrayAdapter<String>( lv.getContext(), android.R.layout.simple_list_item_1); for (int j=0; j<100; j++) { adapter.add("Hello" + j); } lv.setAdapter(adapter); lv.setFastScrollEnabled(true); // ↓これを呼び出すとFastScrollerが表示されない adapter.notifyDataSetChanged(); } }
表示されない原因は FastScroller の mLongList が false になっていること。
ListView を継承したクラスで無理やり対処する方法。
public MyListView extends ListView { Object mFastScroller; Method mFastScroller_onItemCountChanged; @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT && isFastScrollEnabled()) { try { if (mFastScroller == null) { Field fFS = AbsListView.class.getDeclaredField("mFastScroller"); fFS.setAccessible(true); mFastScroller = fFS.get(this); mFastScroller_onItemCountChanged = mFastScroller.getClass().getMethod("onItemCountChanged", int.class); mFastScroller_onItemCountChanged.setAccessible(true); } mFastScroller_onItemCountChanged.invoke(mFastScroller, getCount()); } catch (Exception e) { e.printStackTrace(); } } }