因为项目的原因,需要listview的选中item为当前可见item的中间,但是网上找到的方法又太繁琐,所以自己尝试了一下
private ListView testlv; private int center; private int first;
testlv.setOnItemClickListener(this); testlv.setOnScrollListener(this);
@Override public void onItemClick(AdapterView<?> adapterView, View view, final int i, long l) { if (i > center) { // testlv.setSelection(i - center); testlv.post(new Runnable() { @Override public void run() { if (i-center > first){ testlv.setSelection(i - center); }else { testlv.smoothScrollToPosition(i-center); } } }); } else { testlv.smoothScrollToPosition(0); } } @Override public void onScrollStateChanged(AbsListView absListView, int i) { } @Override public void onScroll(AbsListView absListView, int i, int i1, int i2) { first = i; center = i1 / 2; }
如果使用setSelection(),那么listview会直接跳到指定条目,中间没有动画,使用smoothScrollToPosition()则会有一个滚动动画.
不过,使用smoothScrollToPosition()方法时,如果你选择的是当前可见条目的下方(比如当前可见条目总数为10,你选择了第8个可见条目),那么listview不会向上滚动,具体的我也没有研究,大家凑合着用吧,如果有谁有心思研究这个问题也欢迎讨论