【问题标题】:Library PullToRefresh's method setRefreshing() doesn't work库 PullToRefresh 的方法 setRefreshing() 不起作用
【发布时间】:2014-06-13 21:25:05
【问题描述】:

我正在使用这个库:PullToRefresh of Chris Banes

我正在尝试同步方法 setRefreshing()(或 setRefreshing(boolean))以使 ListView 上的视图显示为“正在加载”,但它不起作用。

我也尝试过 setMode(Mode.MANUAL_REFRESHING) 但没有奏效。 当我刷新拉它的工作,是的。

我将它设置在我的 AsyncTask 的 onCreateView() 和 onPreExecute 上,但它都不起作用。

提前致谢。


这就是我声明 PullToRefreshListView 的方式

    lv = (PullToRefreshListView) layout.findViewById(R.id.messaggiListView);
    lv.setPullToRefreshOverScrollEnabled(false);
    lv.setOnRefreshListener(new OnRefreshListener<ListView>(){

        @Override
        public void onRefresh(PullToRefreshBase<ListView> refreshView) {
            ChiamataGETMessaggi chiamata = new ChiamataGETMessaggi();
            chiamata.execute(WS.anteprime(HomeActivity.auth));              
        }

    });

这就是我在 AsyncTask 上设置刷新方法的方式:

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            lv.setRefreshing();
        } 

这就是我在我的 XML 中声明它的方式。

    <com.handmark.pulltorefresh.library.PullToRefreshListView
    android:id="@+id/messaggiListView" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_above="@+id/ultimoAccessoContainer" 
    android:layout_below="@+id/rlScrivi" 
    android:layout_alignParentLeft="true" />

解决方案

我不知道为什么,即使在视图初始化但没有工作之后我也在调用......(我的意思是,onCreateView)。 Dave Morrissey 给了我在 UI 线程上工作的解决方案,但我不知道为什么它不起作用......只是我在我的 AsyncTask 的 onPreExecute() 上实现了这个:

    new Thread() {
        public void run() {
                try {
                    main.runOnUiThread(new Runnable() {

                        @Override
                        public void run() {
                            lv.setRefreshing(true); 
                        }
                    });
                } catch (Exception e) {
                    e.printStackTrace();
                }
        }
    }.start();

现在它可以工作了。谢谢。

【问题讨论】:

  • 请发布您的片段代码和列表视图的xml位置
  • 我不确定,但我想知道从 AsyncTask 调用这些方法是否会失败,因为您不在 UI 线程上。您能否尝试在启动AsyncTask 时从您的Activity 调用这些方法,以便调用发生在UI 线程上?
  • 嗨@DaveMorrissey,我也试图在onCreateView 上这样做......那不是UI线程吗?因为我已经实现了一个 runOnUiThread() 并且现在它可以工作了……你给了我最后的一点我想说的……你能把它作为答案发布,我把它标记为正确吗?
  • 是的,onCreateView 在 UI 线程中,但我猜在那个阶段视图还没有初始化。

标签: android listview pull-to-refresh


【解决方案1】:

当从 AsyncTask 调用 setRefreshing() 方法时,您不在 UI 线程上,因此 UI 更新失败。可能的替代方法是在启动 AsyncTask 之前立即调用此方法,或者确保在任务运行时将调用发布到 UI 线程。

【讨论】:

  • AsyncTask.onPreExecute() 在 UI 线程上运行。他正在从这个方法调用 setRefreshing()。
【解决方案2】:

此错误可能是由于在应用程序开始时调用 setRefreshing(true)mHeaderLayout 尚未完全初始化造成的。

转到PullToRefreshBase类中的方法onRefreshing(final boolean doScroll)

找线:smoothScrollTo(-getHeaderSize(), listener);

并将getHeaderSize()替换为-146

smoothScrollTo(-146, listener);

146 是在正常工作时从getHeaderSize() 的结果记录下来的。

如果您有自定义的mHeaderLayout,您可能会得到与getHeaderSize() 不同的结果,请改用您的号码。

【讨论】:

    猜你喜欢
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多