重新加载数据后,在Fragment中刷新ListView

时间:2013-08-09 01:19:13

标签: android android-asynctask fragment

我知道这方面有很多答案,但我似乎无法按照我的意愿行事。我有SherlockFragment包含ListView,其中包含从文件中检索的某些数据。我已经为Fragment添加了一个刷新按钮,这个想法是当你按下它时它会检索文件中的任何更改并在必要时将它们添加到视图中。我还添加了流行的PullToRefresh库。

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

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

这实现了我想要的东西,但它并不是很流行,你可以看到它强制重新加载。我目前正在使用PullToRefresh,它会突然强行关闭页面,坦率地说它看起来很糟糕。说白了,我需要从我的AsyncTask重新加载数据中调用我的Fragment的onCreateView

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

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

感谢任何指导。

1 个答案:

答案 0 :(得分:1)

我找到了解决这个问题的办法,但这并不完美,所以我不会接受这个,以防万一有更好的事情发生。

因为在返回我的片段时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,然后重建列表(它&# 39;凌乱,但无论如何都有效:

@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:

注意到我错过了一些明显的东西。我刚刚将PullToRefresh视图的list.onRefreshComplete();更改为我的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();
}