2014-09-02 27 views
0

啓動時,會執行一個異步類,它會抓取網站以獲取信息。在收集的信息填充到列表視圖之前,屏幕在此期間保持空白。在這段時間內是否有添加加載屏幕的方法?在異步http請求下加載屏幕

我看着這個(Add the loading screen in starting of the android application),但我不認爲這是我所需要的,因爲我不知道該請求需要多長時間。

謝謝你的時間。

在看到一些答案之後,我修改了我的代碼,但都沒有看到。這裏是我的活動主要xml文件。還有一個textview layout xml文件,用於列表視圖中默認的textview元素。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
android:paddingBottom="@dimen/activity_vertical_margin" 
tools:context=".MainActivity"> 

<ProgressBar 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/progressBar" 
    style="?android:attr/progressBarStyleLarge" 
    android:layout_centerInParent="true"/> 


<ListView 
    android:layout_width="match_parent" 
    android:layout_height="507dp" 
    android:id="@+id/listView" 
    android:smoothScrollbar="true" /> 



</RelativeLayout> 

這裏是主要的活動代碼:

package adam.example.com.stockexample; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.ProgressBar; 
import android.widget.TextView; 

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStreamWriter; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.concurrent.ExecutionException; 


public class MainActivity extends Activity { 
    private int index=-1; 



    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final ListView ListStock= (ListView)findViewById(R.id.listView); 
     final ArrayList<String>symbols= new ArrayList<String>(); 
     final ProgressBar pb= (ProgressBar)findViewById(R.id.progressBar); 
     List<StockElement> stats= new ArrayList<StockElement>(); 
     List<String> StringList= new ArrayList<String>(); 

     pb.setVisibility(View.VISIBLE); 

     try { 
      InputStream inputStream = openFileInput("stocks.txt"); 

      if (inputStream != null) { 
       InputStreamReader inputStreamReader = new InputStreamReader(inputStream); 
       BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 
       String receiveString = ""; 
       StringBuilder stringBuilder = new StringBuilder(); 

       while ((receiveString = bufferedReader.readLine()) != null) { 
        stringBuilder.append(receiveString); 
       } 

       inputStream.close(); 
       String []ret = stringBuilder.toString().split(","); 

       for(int x=0;x<ret.length;x++){ 
        symbols.add(ret[x]); 
       } 

      } 
     } 
     catch (FileNotFoundException e) { 
      Log.e("login activity", "File not found: " + e.toString()); 
     } catch (IOException e) { 
      Log.e("login activity", "Can not read file: " + e.toString()); 
     } 


     for(int x=0;x<symbols.size();x++){ 
      stats.add(addStock(symbols.get(x))); 
     } 
     for(int x=0;x<stats.size();x++){ 
      StringList.add(stats.get(x).toString()); 
     } 


     final ArrayAdapter<String> stockAdapter= 
      new ArrayAdapter<String>(
        getApplicationContext(), 
        R.layout.list_item_textview, 
        R.id.list_item_textview, 
        StringList); 
     pb.setVisibility(View.GONE); 
     ListStock.setAdapter(stockAdapter); 

     final AlertDialog.Builder builder= new AlertDialog.Builder(this); 
     builder.setMessage("Are you sure you would like to delete this?") 
       .setTitle("Warning") 
       .setPositiveButton("No", null) 
       .setNegativeButton("Delete", new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialogInterface, int i) { 
         stockAdapter.remove(stockAdapter.getItem(index)); 
         symbols.remove(index); 

         WriteBack(symbols); 

         stockAdapter.notifyDataSetChanged(); 
        } 
       }); 


     OnItemClickListener itemClickListener = new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View container, int position, long id) { 
       // Getting the Container Layout of the ListView 

       TextView ItemText = (TextView) container; 
       String selectedItemText=(String)ItemText.getText(); 
       String symbol =selectedItemText.substring(selectedItemText.indexOf(":")+1,selectedItemText.lastIndexOf(")")); 

       Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com/finance?q="+symbol)); 
       startActivity(browserIntent); 
      } 
     }; 

     AdapterView.OnItemLongClickListener itemLongClickListener= new AdapterView.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?>parent, View container, final int position, long id){ 
       TextView ItemText= (TextView) container; 
       String selectedItemText= (String) ItemText.getText(); 
       index=position; 

       builder.show(); 
       return true; 

      } 
     }; 

     ListStock.setOnItemClickListener(itemClickListener); 
     ListStock.setOnItemLongClickListener(itemLongClickListener); 
    } 

    public void WriteBack(ArrayList <String> list){ 
     try { 
      OutputStreamWriter outputStreamWriter = new OutputStreamWriter(openFileOutput("stocks.txt", Context.MODE_PRIVATE)); 
      for(int x=0;x<list.size()-1;x++){ 
       outputStreamWriter.append(list.get(x)+","); 
      } 
      outputStreamWriter.append(list.get(list.size()-1)); 

      outputStreamWriter.close(); 
     } 
     catch (IOException e) { 
      Log.e("Exception", "File write failed: " + e.toString()); 
     } 
    } 



    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    public StockElement addStock(String sym){ 
     try { 
      String s = new HTTPRequest().execute("http://www.google.com/finance?q="+sym).get(); 

      String symbol= s.substring(s.indexOf("<title>")+7,s.indexOf("</title>")); 
      String name= symbol.substring(0,symbol.indexOf(":")); 
      symbol=symbol.substring(symbol.indexOf(":")+2,symbol.indexOf(" quotes")); 

      String price= s.substring(s.indexOf("<meta itemprop=\"price\"")+25,s.indexOf("<meta itemprop=\"price\"")+50); 

      price= price.substring(price.indexOf("\"")+1,price.lastIndexOf("\"")); 

      String priceChange= s.substring(s.indexOf("<meta itemprop=\"priceChange\"")+36,s.indexOf("<meta itemprop=\"priceChange\"")+60); 

      priceChange=priceChange.substring(priceChange.indexOf("\"")+1,priceChange.lastIndexOf("\"")); 

      String percent= s.substring(s.indexOf("<meta itemprop=\"priceChangePercent\"")+36,s.indexOf("<meta itemprop=\"priceChangePercent\"")+60); 

      percent=percent.substring(percent.indexOf("\"")+1,percent.lastIndexOf("\"")); 

      return new StockElement(name,symbol,price,priceChange,percent); 

     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      e.printStackTrace(); 
     }catch (NullPointerException e){ 
      e.printStackTrace(); 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

回答

1

您可以在活動的佈局中添加一個ProgresBar(圓形)。爲了在屏幕中間設置加載圓圈,您可以將佈局設置爲這樣。

<ListView 
    android:id="@+id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:divider="@null" 
    android:listSelector="@android:color/transparent" 
    android:layout_alignParentTop="true"/> 

<ProgressBar 
    android:id="@+id/progress" 
    style="?android:attr/progressBarStyleLarge" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true"/> //to make it appear in the middle of screen 

現在,在您Activity

ProgressBar pb; 
pb = (ProgressBar) findViewById(R.id.progress); 

現在當任務正在進行中,即聯絡你的網站的時候,你可以設置pb.setVisibility(View.VISIBLE);

而一旦你的任務就完成了剛剛成立 pb.setVisibility(View.GONE);

希望它能幫助。

+0

編輯我的答案,以顯示我已經嘗試過。雖然在android studio的xml設計器映像中看起來不錯,但它仍然不可見。 – 2014-09-03 00:12:34

+0

在你的佈局中,'ListView'裏面加上這一行'android:layout_alignParentTop =「true」'。讓我知道它現在是否顯示。 – 2014-09-03 00:16:52

+0

還沒有顯示出來 – 2014-09-03 00:50:27

2

添加視圖到你的XML有一些「加載」的消息。然後使用ListView.setEmptyView(View view)方法讓ListView控制該視圖。它會顯示,直到ListView填充項目。

+0

試過這個,我認爲它會工作得很好,並添加了很多定製,但我仍然與進度條具有相同的可見性問題。謝謝 – 2014-09-03 00:11:37

+0

這可能是因爲您在XML中的ListView之前擁有ProgressBar。嘗試切換順序,ListView可能會覆蓋ProgressBar。 – Coeffect 2014-09-04 18:29:45