2016-06-07 15 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