2015-10-06 68 views
0

這是幾小時我搜索的東西,但它似乎並沒有幫助.. Android Studio不會啓動任何錯誤,但屏幕保持空白。爲什麼?Android之後notifyDataSetChanged ListView保持空白

package org.newapp; 

import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 
import android.util.Log; 
import android.view.Menu; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

import org.xml.sax.SAXException; 

import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.ArrayList; 

import saxrssreader.*; 


public class MainActivity extends Activity { 

    private ArrayAdapter<RssItem> rssItemsArrayAdapter; 
    ListView codeLearnLessons; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     RssItem[] rssItems = new RssItem[]{}; 
     rssItemsArrayAdapter = new ArrayAdapter<RssItem>(this, android.R.layout.simple_list_item_1, rssItems); 
     new WebCall().execute(rssItems); 
     codeLearnLessons = (ListView)findViewById(R.id.listView1); 
     codeLearnLessons.setAdapter(rssItemsArrayAdapter); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    private class WebCall extends AsyncTask<RssItem, Void, Void> { 

     @Override 
     protected Void doInBackground(RssItem... items) { 
      URL url = null; 
      try { 
       url = new URL("http://www.somewpsite.com/feed"); 
      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } 
      try { 
       ArrayList<RssItem> listItems = RssReader.read(url).getRssItems(); 
       items = listItems.toArray(new RssItem[listItems.size()]); 
       final int l = items.length; 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         codeLearnLessons.invalidateViews(); 
         rssItemsArrayAdapter.notifyDataSetChanged(); 
         Log.i("rec", "rec" + l); 
        } 
       }); 
      } catch (SAXException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPreExecute() { 
      /*ProgressDialog mDialog = new ProgressDialog(MainActivity.this); 
      mDialog.setMessage("Please wait..."); 
      mDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
      mDialog.setIndeterminate(true); 
      mDialog.setCancelable(false); 
      mDialog.show();*/ 
     } 
    } 


} 
+1

RssItems可能爲空,所以適配器沒有要顯示的數據。檢查webCall.execute()方法後rssItems的長度。 –

+0

它在這裏簽入:Log.i(「rec」,「rec」+ l); l是15 – LowFieldTheory

+0

再次檢查rssItems _After_ webCall.execute()方法的長度。它將爲0,正如其他人在下面所述,因爲您正在創建一個新數組而不是更新rssItems數組。 –

回答

2

的問題是,使用ArrayList的,只有具有AsyncTask.doInBackground()方法的範圍內的。由於它沒有提供給適配器,因此notifyDataSetChanged()什麼都不做。你需要替換現有的陣列是這樣的:

rssItemsArrayAdapter.clear(); 
rssItemsArrayAdapter.addAll(listItems); 
rssItemsArrayAdapter.notifyDataSetChanged(); 

說了這麼多,你也真的需要改變你的AsyncTask使用。您無需在doInBackground()內撥打runOnUiThread(),因爲AsyncTask會在UI線程上自動運行onPostExecute()。你的doInBackground()方法返回你的新ArrayList<RssItem>並創建一個onPostExecute()覆蓋方法,調整適配器如上所示。

0

您正在將您的項目傳遞給AsyncTask,但是在AsyncTask中,您聲明瞭它們的新結果內容。你永遠不會把項目傳遞給你的ArrayAdapter。使它們成爲你的類實例的一個屬性。

編輯 - 例如:

rssItemsArrayAdapter.clear(); 
rssItemsArrayAdapter.addAll(items); 

事後

rssItemsArrayAdapter.notifyDataSetChanged(); 
+0

我不明白,我該怎麼辦?不是這一行:items = listItems.toArray(new RssItem [listItems.size()]);實現項目變量? – LowFieldTheory

+1

您不要更改ArrayAdapter中的項目,我在答案中包含了一些示例代碼 – Christian