setSelection()是Google为Listview来实现跳转到没有Item,直接setSelection是不起作用。后来查了下资料发现,这个方法只有在listvie完成数据加载之后调用才会生效。
解决
方法1:简单粗暴的方法,直接使用listView.setSelection(),不过在这行代码前重新listView.setAdapter()一下,懒一点的童鞋可以使用这种。
方法2:对性能有洁癖的童鞋可以用这种,Listview源码下有个 layoutChildren()的方法,发现里面有个datachanged的属性。表示数据加载完成,数据加载完成之后会调用一个叫做handlechange的方法。
boolean dataChanged = mDataChanged;
if (dataChanged) {
handleDataChanged();
}
好了有思路了,自定义一个Listview重写里面的handledatachanded方法,在里面加一个回调,然后将setSelection这个方法放在这个回调里面去执行。测试了一下,发现这个方法果然能保证setSelection百分百生效。
public class HandleDataListView extends ListView {
DataChangedListener dataChangedListener;
public HandleDataListView(Context context) {
super(context);
}
public HandleDataListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public HandleDataListView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void handleDataChanged() {
super.handleDataChanged();
dataChangedListener.onSuccess();
}
public void setDataChangedListener(DataChangedListener dataChangedListener) {
this.dataChangedListener = dataChangedListener;
}
public interface DataChangedListener{
public void onSuccess();
}
}
setSelection放在回调中调用
listView.setDataChangedListener(new HandleDataListView.DataChangedListener() {
@Override
public void onSuccess() {
listView.setSelection(1);
});