2016-01-13 238 views
1

我嘗試使用notifyDataSetChanged()刷新我的listview,但它被標記爲紅色。我使用像擴展適配器ListView,所以notifyDataSetChaned它應該工作,但否則。如何使用BaseAdapter刷新我的ListView

下面是我的聲明ListView和ArrayList。

ListView listview; 
ArrayList<ListData> myList = new ArrayList<>(); 

設置我的列表中這樣說:

listview = (ListView) findViewById(R.id.listView); 
listview.setAdapter(new MyBaseAdapter(this, myList)); 

我也setOnScrollListener使用,我想我的列表視圖它時刷新SROLL_STATE = 0;

listview.setOnScrollListener(new AbsListView.OnScrollListener() { 

     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) { 
      int position = listview.getFirstVisiblePosition(); 

      SCROLL_STATE = position; 

      if (SCROLL_STATE == 0) { 
       listview.notifyDataSetChanged(); // Here is a problem, because it's not work 
      } 

     } 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 

     } 
    }); 
+0

也許你應該檢查你的導入的包名是你的擴展列表視圖。 –

回答

2

定義一個適配器對象, MyBaseAdapter適配器=新MyBaseAdapter(此,myList中); adapter.notifyDataSetChanged();

+0

我有一個日誌:調用OpenGL ES API沒有當前上下文(每個線程記錄一次) – SeaDog

+0

太棒了!這個日誌我有,因爲我創建一個堆棧活動,並在某個地方是錯誤的。當我開啓一項活動並使用您的解決方案時,一切都是最好的。請告訴我,如何從IntentService刷新listview?我創建了公共靜態MyBaseAdapter mListAdapter,並嘗試從IntentService調用該方法,但我的應用程序已關閉。 – SeaDog

2

notifyDataSetChanged()BaseAdapter類的方法和的ListView類。因此,調用listView.notifyDatasSetChanged();在邏輯和語法上不正確。

替換該符合

listView.getAdapter().notifyDataSetChanged(); 

所有最好:)

+0

My BaseAdapter是公共類MyBaseAdapter的擴展「public class MyBaseAdapter extends BaseAdapter {」我嘗試從其他活動調用notifyDataSetChanged()。你的例子不幸解決了我的問題。 – SeaDog

+0

我明白了。 notifyDataSetChanged()是該類的公共方法。我建議的路線是首先獲取與listView關聯的適配器,然後調用notifyDataSetChanged()方法重繪列表視圖,如果基礎數據發生任何更改(數據中的任何插入或刪除)。 –

+0

我不能使用這種方法。我會解釋發生了什麼事。該包是從公共JSONArray創建的。在這個數組中更多的是一個JSONObject,它的工作完美。在使用帶有HttpRequest的IntentService的後臺下載新數據(如果存在)。當下載新數據時,全局JSONAarray會更改,但我的列表視圖不會更改。現在我必須刷新listview而不創建新的活動。 – SeaDog