2016-06-07 40 views
0

我有一个ListView,其上实现了一个SwipeRefreshLayout。我想要做的是在用户向下滑动时更新ListView。我试过寻找不同的选择,但不幸的是我无法找到解决方案。正在更新桌面上的列表视图

重新加载FragmentonCreate函数会更好吗?

这里是我的代码

public class NewsTab extends Fragment implements OnRefreshListener{ 
final LinkedList<News> listnews = new LinkedList<News>(); 


public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.news_tab, container, false); 
     swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_refresh_layout); 
     swipeRefreshLayout.setOnRefreshListener(this); 

     newslist = (ListView) view.findViewById(R.id.displaynews); 

     populatelist(listnews); 
     adapter = new CustomAdapter(getActivity(),listnews); 
     newslist.setAdapter(adapter); 
     return view; 
} 

public void onRefresh() { 
    swipeRefreshLayout.setRefreshing(true); 
    new StartNewsLoad().execute(""); 
} 

private class StartNewsLoad extends AsyncTask<String, Void, String> { 
    //ProgressDialog pd = null; 
    protected String doInBackground(String... params) { 
     reloadNews(); 
     loadTopNews(); 
     //NewsTab.listnews = new LinkedList<News>(); 
     return null; 
    } 

    protected void onPostExecute(String result) { 
     adapter = new CustomAdapter(getActivity(),listnews); 
     adapter.notifyDataSetChanged(); 
     swipeRefreshLayout.setRefreshing(false); 
    } 
} 

/// ANSWER

我找到了答案!我在我的服装适配器中添加了以下代码行,并将其称为adapter.refresh();

public void refresh(LinkedList<News> newsList) 
    { 
     this.results = newsList; 
     notifyDataSetChanged(); 
    } 

谢谢大家的帮助!

+1

您需要在通知它之前在ListView上设置适配器 –

+1

除此之外,'listnews'从哪里来?请显示[mcve] –

+0

@ cricket_007感谢您的回复listnews是我创建的全球链表,请参阅上面的编辑 – paul590

回答

1

首先不需要在onPostExecute()中重新创建适配器,因为您已经在onCreateView()中初始化了适配器。如果发生更改,您需要简单地通知适配器“listnews”中的更改。确保您的列表在致电notifyDataSetChanged()之前实际发生了变化。

也请使用调试器或日志来检查您的onRefresh()是否被调用。从我看到的方式来看,它应该用@override注释重写,因为它是由您的片段实现的接口的方法(swipeRefreshLayout.setOnRefreshListener(this);)。它应该是这样的:

@Override 
public void onRefresh() { 
    swipeRefreshLayout.setRefreshing(true); 
    new StartNewsLoad().execute(""); 
    } 
+0

感谢您的回复,adapter = new CustomAdapter(getActivity(),listnews);即时通讯添加它像这样,以添加新的列表是否有办法只是为了我已经? – paul590

+0

@ paul590你在创建适配器时做得很好,但是当你需要更新列表视图时,不要再创建它,或者在listview.Simple中调用notifydatasetchanged,当你的数组在列表中更改时再次设置它。 –

+0

感谢您向我提供此信息,我删除了listview.setadapter(适配器)行和ket notifydatasetchanged,但我的列表没有使用新值更新,我测试了这些值是通过滚动到另一个拉动相同信息的选项卡添加的和新的死了,我错过了一个提交行或任何启动更新列表? – paul590

1

在onCreateView()intialize您的ListView和swiperefereshLayout与监听器和适配器设置为您的ListView像--->

if(adapter==null&& listNews==null){ 
listnews=new ArrayList<object>(); 
adapter=new CustomAdapter(getActivity(),listnews); 
listView.setAdapter(adapter); 
adapter.notifyDataSetChanged();} 
else{ 
listView.setAdapter(adapter);} 

这种方式还可以处理保留onDrientationchange上的listData。

当你得到api响应或刷新列表视图与滑动布局,不要创建新的适配器只需添加listNews适配器并调用adapter.notifyDataSetChanged();

+0

感谢您的回复,我将如何添加到适配器而不是重新创建它? – paul590

+0

你好,尝试应用你的建议后,我仍然无法看到列表更新,我已经删除了setadapter行,并保持adapter = new CustomAdapter(getActivity(),listnews)和adapter.notifyDataSetChanged(),但没有运气 – paul590

+0

感谢您的帮助,我发现我的答案见上文! – paul590