SwipeRefreshLayout动画在onRefresh()时冻结

4
当我刷新时,SwipeRefreshLayout的动画会显示,但在onRefresh()运行时会被冻结,只有当onRefresh()完成后才开始旋转。
主活动(MainActivity)。
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);
}

onRefresh:

@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);
}
3个回答

2

问题已解决!

我把刷新代码放在了一个可运行的线程中: (我也改变了我的刷新方式)

@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();
}

0
    @Override
    public void onRefresh() {
         .....
        RVAdapterMain adapter = new RVAdapterMain(packages);
        recyclerView.setAdapter(adapter);
        ....
    }
    .....
}

首先,这似乎是错误的。请在onCreate()方法中使用它,并创建一个新的方法将新数据添加到适配器中。当您在onRefresh()方法中刷新时,只需使用新数据集调用notifiyDataSetChanged()方法,而不是每次都使用新适配器。


好的,我会更改它,但是这是在OnCreate()中使用的,通过调用callPackageList()函数;但我认为这还不是问题。 - Rafael Mansilha Murta

0

在onRefresh()方法中,您不需要设置setRefreshing(true)语句。

当我们向下拖动UI时,旋转的图标会自动启动。

您只需要在达到所需结果的位置上停止旋转图标,而不是在onRefresh()方法中设置setRefreshing(false)。

例如,如果您正在调用API,则需要在从服务器获取响应的地方设置setRefreshing(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);



        }
    };

我看到了,所以我设置了setRefreshing(true);因为它被冻结了。 - Rafael Mansilha Murta
嗯..你能详细解释一下你面临的问题吗? - Harish Vats
1
当我下拉刷新时,动画效果非常好,但是当我从屏幕上移开手指进行刷新时,动画会冻结(不旋转)。当我删除 swipeRefreshLayout.setRefreshing(false); 时,我意识到它只有在 OnRefresh 函数结束时才开始旋转。 - Rafael Mansilha Murta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接