SwipeRefreshLayout 动画冻结 onRefresh()
SwipeRefreshLayout animation freezes onRefresh()
滑动刷新时显示SwipeRefreshLayout的动画,但在onRefresh()运行时冻结,只有在onRefresh()完成后才开始旋转。
主要活动
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myFAB = (FloatingActionButton) findViewById(R.id.myFAB);
recyclerView = (RecyclerView) findViewById(R.id.rv);
recyclerView.setHasFixedSize(true);
LinearLayoutManager llm = new LinearLayoutManager(this);
recyclerView.setLayoutManager(llm);
recyclerView.addItemDecoration(new SimpleDividerItemDecoration(this));
callCadastroEncoemnda();
callPackageList();
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);
swipeRefreshLayout.setOnRefreshListener(this);
swipeRefreshLayout.setColorSchemeResources(
android.R.color.holo_blue_bright,
android.R.color.holo_green_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light);
}
刷新时:
@Override
public void onRefresh() {
swipeRefreshLayout.setRefreshing(true);
Update.updateAll(MainActivity.this);
//Check if the data change
if (!packages.equals(dao.getPackages())) {
adapter.updateList(dao.getPackages());
}
swipeRefreshLayout.setRefreshing(false);
}
@Override
public void onRefresh() {
.....
RVAdapterMain adapter = new RVAdapterMain(packages);
recyclerView.setAdapter(adapter);
....
}
.....
}
首先,这似乎是错误的。你能在 onCreate() 中使用它吗?并创建新方法,将新数据添加到您的适配器中。当您刷新 onRefresh 方法时,仅使用新数据集通知 notifiyDataSetChanged() 而不是每次都使用新适配器。
您不需要在 onRefresh() 方法中有 setRefreshing(true) 语句。
当我们向下拖动 Ui 时,旋转的东西会自动开始。
您只需要 setRefreshing(false) 将微调器停止在达到您想要的结果的地方,而不是在 onRefresh() 中。
例如,如果您正在点击 api,我们需要在我们从服务器获得响应的那一点设置刷新(false),即 onPostExecute 或类似的。
以下是我的使用方法:
/**
* on Refreshing, fetch trip history again.
*/
@Override
public void onRefresh() {
fetchTripHistory();
}
@Override
public void onFailOfResponse(Object... arguments) {
mSwipeRefreshLayout.setRefreshing(false);
noDataText.setVisibility(View.VISIBLE);
}
};
已解决!
我已将刷新代码放在 Runnable 上:
(我也改变了我的刷新)
@Override
public void onRefresh() {
new Thread(new Runnable() {
@Override
public void run() {
try {
if (Update.updateAll(MainActivity.this)) {
packages = dao.getPackages(config.getFilter());
packagesAux = dao.getPackages(config.getFilter());
runOnUiThread(new Runnable() {
@Override
public void run() {
adapter.animateTo(packages);
}
});
}
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
runOnUiThread(new Runnable() {
@Override
public void run() {
swipeRefreshLayout.setRefreshing(false);
}
});
}
}).start();
}
滑动刷新时显示SwipeRefreshLayout的动画,但在onRefresh()运行时冻结,只有在onRefresh()完成后才开始旋转。
主要活动
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myFAB = (FloatingActionButton) findViewById(R.id.myFAB);
recyclerView = (RecyclerView) findViewById(R.id.rv);
recyclerView.setHasFixedSize(true);
LinearLayoutManager llm = new LinearLayoutManager(this);
recyclerView.setLayoutManager(llm);
recyclerView.addItemDecoration(new SimpleDividerItemDecoration(this));
callCadastroEncoemnda();
callPackageList();
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);
swipeRefreshLayout.setOnRefreshListener(this);
swipeRefreshLayout.setColorSchemeResources(
android.R.color.holo_blue_bright,
android.R.color.holo_green_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light);
}
刷新时:
@Override
public void onRefresh() {
swipeRefreshLayout.setRefreshing(true);
Update.updateAll(MainActivity.this);
//Check if the data change
if (!packages.equals(dao.getPackages())) {
adapter.updateList(dao.getPackages());
}
swipeRefreshLayout.setRefreshing(false);
}
@Override
public void onRefresh() {
.....
RVAdapterMain adapter = new RVAdapterMain(packages);
recyclerView.setAdapter(adapter);
....
}
.....
}
首先,这似乎是错误的。你能在 onCreate() 中使用它吗?并创建新方法,将新数据添加到您的适配器中。当您刷新 onRefresh 方法时,仅使用新数据集通知 notifiyDataSetChanged() 而不是每次都使用新适配器。
您不需要在 onRefresh() 方法中有 setRefreshing(true) 语句。 当我们向下拖动 Ui 时,旋转的东西会自动开始。
您只需要 setRefreshing(false) 将微调器停止在达到您想要的结果的地方,而不是在 onRefresh() 中。
例如,如果您正在点击 api,我们需要在我们从服务器获得响应的那一点设置刷新(false),即 onPostExecute 或类似的。
以下是我的使用方法:
/**
* on Refreshing, fetch trip history again.
*/
@Override
public void onRefresh() {
fetchTripHistory();
}
@Override
public void onFailOfResponse(Object... arguments) {
mSwipeRefreshLayout.setRefreshing(false);
noDataText.setVisibility(View.VISIBLE);
}
};
已解决!
我已将刷新代码放在 Runnable 上: (我也改变了我的刷新)
@Override
public void onRefresh() {
new Thread(new Runnable() {
@Override
public void run() {
try {
if (Update.updateAll(MainActivity.this)) {
packages = dao.getPackages(config.getFilter());
packagesAux = dao.getPackages(config.getFilter());
runOnUiThread(new Runnable() {
@Override
public void run() {
adapter.animateTo(packages);
}
});
}
} catch (ExecutionException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
runOnUiThread(new Runnable() {
@Override
public void run() {
swipeRefreshLayout.setRefreshing(false);
}
});
}
}).start();
}