2012-10-01 51 views
0

我有一个活动,RSS源从网站加载并显示在列表视图中。事情是需要几秒钟才能将东西加载到列表视图中。我想实现一个进度条来通知用户有关数据的加载。如何在加载列表视图时实现进度条? - android

下面是显示RSS的订阅源代码..

public class RSS extends ListActivity { 
    List<String> headlines; 
    List<String> links; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_rss); 

    // Initializing instance variables 
     headlines = new ArrayList<String>(); 
     links = new ArrayList<String>(); 

     try { 
      URL url = new URL("http://feeds.pcworld.com/pcworld/latestnews"); 

      XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
      factory.setNamespaceAware(false); 
      XmlPullParser xpp = factory.newPullParser(); 

       // We will get the XML from an input stream 
      xpp.setInput(getInputStream(url), "UTF_8"); 

      boolean insideItem = false; 

       // Returns the type of current event: START_TAG, END_TAG, etc.. 
      int eventType = xpp.getEventType(); 
      while (eventType != XmlPullParser.END_DOCUMENT) { 
       if (eventType == XmlPullParser.START_TAG) { 

        if (xpp.getName().equalsIgnoreCase("item")) { 
         insideItem = true; 
        } else if (xpp.getName().equalsIgnoreCase("title")) { 
         if (insideItem) 
          headlines.add(xpp.nextText()); //extract the headline 
        } else if (xpp.getName().equalsIgnoreCase("link")) { 
         if (insideItem) 
          links.add(xpp.nextText()); //extract the link of article 
        } 
       }else if(eventType==XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("item")){ 
        insideItem=false; 
       } 

       eventType = xpp.next(); //move to next element 
      } 

     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (XmlPullParserException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     // Binding data 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, headlines); 

     setListAdapter(adapter); 


    } 
    private InputStream getInputStream(URL url) { 
     // TODO Auto-generated method stub 
      try { 
       return url.openConnection().getInputStream(); 
      } catch (IOException e) { 
       return null; 
      } 
    } 
    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     // TODO Auto-generated method stub 
     Uri uri = Uri.parse((String) links.get(position)); 
      Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
      startActivity(intent); 
    } 
} 

所以有人可以帮我在加载数据的时候实现一个简单的进度? :)

回答

1

你应该使用AsyncTask来执行你所有下载的东西。然后在AsyncTask的onProgessUpdate方法中,将适配器刷新到列表视图。

class LoadingTask extends AsyncTask<URL, Integer, Integer> { 
    ProgressDialog mDialog; 
    BaseAdapter mAdapter 
    public LoadingTask(Context context, BaseAdapter adapter) { 
     mDialog = new ProgressDialog(context); 
     mAdapter = adapter; 
     // Do your dialog stuff here 
    } 

    @Override 
    public Integer doInBackground(URL... urls) { 
     int result = 0; // number of loaded entities 

     while (needsToDownload) { 
      // Do your downloading here 


      updateProgress(result/urls.length); 
     } 

     return result; 
    } 

    @Override 
    public void onProgressUpdate(Integer... ints) { 
     mDialog.setProgress(ints[0]); 
     mAdapter.notifyDatasetChanged() 
    } 

    public void onPostExecute(Integer result) { 
     mDialog.dismiss() 
     Toast.makeToast(context, "Loaded " + result + " urls...", 1).show(); 
    } 
} 
+0

我该如何刷新适配器到列表视图? – kumareloaded

+0

在LoaderTask的构造函数中,将引用传递给Adapter。然后在'onProgressUpdate'上做'adapter.notifyDatasetChanged()' – AedonEtLIRA

+0

就够了吗?我应该在哪里使用进度条?在RSS或LoadingTask? – kumareloaded

相关问题