1

我知道对此有很多答案,但我似乎无法让它按我的意愿工作。我有一个SherlockFragment包含一个ListView由从文件中检索的一些数据填充的。我在片段中添加了一个刷新按钮,其想法是当您按下它时,它会检索文件中的任何更改并在必要时将它们添加到视图中。我还添加了流行的 PullToRefresh 库。

不幸的是,当我重新加载片段(例如,旋转设备)时,没有任何变化,我可以看到新数据。我读过notifyDataSetChanged()但它对我不起作用。我唯一能做的就是从我的主要 FragmentActivity 类调用mPager.notifyDataSetChanged()并在我的 ViewPager 适配器中设置以下内容:

@Override
public int getItemPosition(Object object) {
    return POSITION_NONE;
}

这完成了我想要的,但它不是很圆滑,你可以看到它强制重新加载。我目前正在使用 PullToRefresh,它会突然将其从页面上强制关闭,坦率地说,它看起来很糟糕。坦率地说,我需要onCreateView从我的 AsyncTask 中调用我的 Fragment 来重新加载数据。

如果需要,我会发布代码,代码很多,所以我不想发布任何不需要的东西。

哦,请注意我notifyDataSetChanged()onPostExecute()我的任务中尝试过。

感谢您的任何指导。

4

1 回答 1

1

我找到了解决这个问题的方法,但它并不完美,所以我不会接受这个,以防出现更好的情况。

因为在返回我的 Fragment 时onResume()被调用(这个答案也非常特定于我的项目),我只是做了以下事情:

@Override 
public void onResume(){
    super.onResume();
    // Make the adapter again
    adapter = new FeedListAdapter(this, feed);
    // Set it to the list again
    list.setAdapter(adapter); 
}

这刷新了列表(很糟糕)并且仍然相当明显,尽管如果我使用按钮而不是 PullToRefresh 它不是。

我的解决方案(无论多么糟糕)与 PullToRefresh 一起将其粘贴在具有延迟触发器的处理程序中,以让下拉的“刷新”部分在它运行之前消失。

@Override 
public void onResume(){
    super.onResume();
    new Handler().postDelayed(new Runnable() { 
        public void run() { 
            adapter = new FeedListAdapter(this, feed);
            list.setAdapter(adapter); 
        } 
    }, 500); 
}

同样,这对我的项目来说非常具体,而且是一种非常奇怪的做法,所以请分享任何“完美”的答案:)

编辑: PullToRefresh 仍然存在一个问题,所以我的解决方案是在一个新线程中等待,直到 PullToRefresh 再次被隐藏,然后重建列表(它很混乱,但无论如何它都可以工作):

@Override 
public void onResume(){
    super.onResume();
    // Start a new thread
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                // Wait until the PullToRefresh is hidden
                synchronized(this){
                    wait(190);
                }
            } catch(InterruptedException ex) { }
            // Post a new runnable
            threadHandler.post(new Runnable(){
                public void run(){
                        // Recreate the adapter from the new feed
                        adapter = new FeedListAdapter(FeedListActivity.this, feed);
                        // Set the recreated adapter
                        list.setAdapter(adapter); 
                    }
                });
            }
        }).start();
    }
}

编辑2:

只是注意到我错过了一些明显的东西。我刚刚list.onRefreshComplete();将 PullToRefresh 视图更改为我的,onResume()并且处理了跳跃性。不过,我认为上述解决方案更令人印象深刻:p

所以我的代码:

@Override 
public void onResume(){
    super.onResume();
    // Recreate the adapter from the new feed
    adapter = new FeedListAdapter(this, feed);
    // Set the recreated adapter
    list.setAdapter(adapter); 
    // The list has finished refreshing
    list.onRefreshComplete();
}
于 2013-08-09T02:36:57.723 回答