根据RecyclerView中的Scroll事件更改方向



我正试图根据用户的上/下滚动或左/右滚动操作来更改回收视图的方向。这是我的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);
}
});

最新更新