我正试图根据用户的上/下滚动或左/右滚动操作来更改回收视图的方向。这是我的onCreate()方法:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler);
recyclerView.setAdapter(new MyAdapter(totalItemCount));
// default orientation is VERTICAL
gridLayoutManager = new GridLayoutManager(this, spanCount, LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(gridLayoutManager);
RecyclerView.OnScrollListener listener = new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
Log.i("TAG", "current orientation: " + gridLayoutManager.getOrientation());
if (dx > 0) {
Log.i("TAG", "dx = " + dx);
recyclerView.post(new Runnable() {
@Override
public void run() {
gridLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
}
});
} else if (dy > 0) {
Log.i("TAG", "dy = " + dy);
recyclerView.post(new Runnable() {
@Override
public void run() {
gridLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
}
});
}
recyclerView.setLayoutManager(gridLayoutManager);
}
};
recyclerView.addOnScrollListener(listener);
}
问题是,它并没有改变回收观的定位。这是改变方向的正确方法吗?
编辑
建议修改代码(由@RobCo)后也没有例外。但我仍然无法改变方向。
错误消息非常清楚:
无法在滚动回调中调用此方法。滚动回调可能在测量期间运行;布局过程中,您无法更改RecyclerView数据。任何可能更改RecyclerView结构或适配器内容的方法调用都应推迟到下一帧。
因此,setOrientation
不能从布局或度量传递中调用,也不能在滚动回调期间调用。你必须发布一个Runnable到下一帧:
recyclerView.post(new Runnable() {
@Override
public void run() {
gridLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
}
});