2014-09-01 27 views
0

首先抱歉,如果它的重複,因爲我問它,因爲無法理解其他問題的任何事情,或者我可以說我不能實現我的情況。 其實我堅持的情況下,我想更新我的ListViewAsyncTask網絡更新一個,但現在如何實現它,不知道我嘗試了幾件事,但無法使其工作。請誰能解釋我詳細介紹瞭如何做到這一點,這是我的活動和異步類代碼如何更新從AsyncTask的列表視圖

package app.balaji.sid.listapp; 

    import android.os.AsyncTask; 
    import android.os.Bundle; 
    import android.support.v7.app.ActionBarActivity; 
    import android.util.Log; 
    import android.view.Menu; 
    import android.view.MenuItem; 
    import android.widget.ArrayAdapter; 
    import android.widget.ListView; 

    import it.sauronsoftware.ftp4j.FTPClient; 
    import it.sauronsoftware.ftp4j.FTPFile; 


    public class ListActivity extends ActionBarActivity { 
     ListView lv; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_list); 
      lv=(ListView)findViewById(R.id.listView); 
      String[] values = new String[] { "Item 1", 
        "Item 2", 
        "Item 3 ", 
        "Item 4", 
        "Item 5", 
        "Item 6", 
        "Item 7", 
        "Item 8" 
      }; 
      ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
        android.R.layout.simple_list_item_1, android.R.id.text1, values); 
      lv.setAdapter(adapter); 
      new ListFetcher().execute(); 


     } 


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

     @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); 
     } 

     protected class ListFetcher extends AsyncTask<String,String,String>{ 
      String sid; 


      @Override 
      protected String doInBackground(String... params) { 
       String user = "user"; 
       String pass="password"; 
       String host="204.236.238.164"; 

       FTPClient client = new FTPClient(); 

       try { 

        client.connect(host,21); 
        client.login(user, pass); 
        client.setType(FTPClient.TYPE_BINARY); 
        client.changeDirectory("/"); 

        FTPFile[] files = client.list(); 
        String[] fileNames = new String[files.length]; 

        for (int i = 0; i < files.length; i++) 
        { 
         fileNames[i] = files[i].getName(); 
         String logVariable=fileNames[i]; 
         Log.v(sid, logVariable);  // Here i am able to see list in log 
        } 

        }catch (Exception e) 
       { 

        Log.v(sid,e.toString()); 
       } 





       return sid; 
      } 

      protected void onPostExecute() 
      { 

    //i think list should be updated from here but don't know how to do it correctly 
    // i just know i can update my listview by creating a new adapter and assign it to listview but don't know how 
// also i am not able to get the fileNames array here 

      } 



     } 
    } 
+0

答:創建延伸的AsyncTask繼承類,讓它實現其MainActivity還實現了一個接口,並調用它的職位。 B:爲派生類中的Activity提供一個弱引用,並將Activity引用傳遞給派生類,以便調用公共方法的Activity或從onPostExecute調用runOnUiThread。 Thogh我以爲onPost已經在ui線程上運行了。 – icbytes 2014-09-01 17:10:53

+0

@icbytes你可以請回答一些例子,因爲我是新來的android,所以不知道太多 – Sid 2014-09-01 17:16:52

+0

@icbytes它在UI上運行線程,所以不需要'runOnUiThread()'有 – codeMagic 2014-09-01 17:18:06

回答

0

這將是比較容易回答,如果你發佈鏈接,愚弄你試過並解釋你做了什麼不理解。什麼是/沒有發生也會有所幫助。但是,從我所看到的情況來看,您只需將新的String傳遞給onPostExecute(),並在那裏更新列表和Adapter

protected void onPostExecute(String result) // get the String you are passing 
{ 

    //i think list should be updated from here but don't know how to do it correctly 
    // I agree. Let's try this 
    if(result != null) // let's make sure you got something 
    { 
     values.add(result); // add the new String to your list 
     adapter.notifyDataSetChanged(); // Hey, Adapter, we've got some new data 

} 

你需要改變你的ArrayArrayList這樣的長度可以是動態的。你也會想讓這個和你的Adapter成員變量,所以內部類可以看到他們。

public class ListActivity extends ActionBarActivity { 
    ListView lv; 

    // Declare them here 
    ArrayAdapter<String> adapter; 
    ArrayList<String> values = new ArrayList<String>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_list); 
    lv=(ListView)findViewById(R.id.listView); 
    values.add("Item 1"); 
    values.add("Items 2"); 

    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, 
      android.R.id.text1, values); 
    lv.setAdapter(adapter); 
    new ListFetcher().execute(); 

您沒有傳遞任何你的任務,但要返回一個數組

@Override 
     protected String[] doInBackground(Void... params) { 

protected void onPostExecute(String[] result) 

如果您正在返回一個完全新的價值觀,爲您的適配器,那麼你可以只是更新新的價值。如果您只是添加一些值,那麼您可以遍歷它們並將它們添加到您的ArrayList並呼叫notifyDataSetChanged(),如上所示。

+0

感謝讓我理解關於它,但知道應用程序強制關閉Collections.addAll(值,結果); // Log.v(sid,「working here」); adapter.notifyDataSetChanged(); //這裏停止 – Sid 2014-09-01 18:14:29

+0

不客氣。這比給我工作代碼更有幫助。我不知道你得到的錯誤是什麼。 – codeMagic 2014-09-01 18:20:52

+0

這是我在停止應用程序後得到的日誌09-02 00:05:08.221 4074-4074/app.balaji.sid.listapp E/AndroidRuntime:致命異常:主要 過程:app.balaji.sid.listapp, PID:4074 java.lang.NullPointerException at app.balaji.sid.listapp.ListActivity $ ListFetcher.onPostExecute(ListActivity.java:116) at app.balaji.sid.listapp.ListActivity $ ListFetcher.onPostExecute(ListActivity。java:61) – Sid 2014-09-01 18:37:56

0

我剛剛解決了我的問題,所以只是覺得我需要分享它,所以其他面臨同樣問題的人可以輕鬆完成。

因此,首先在我的問題,我剛剛聲明我的AsyncTask類與字符串參數,但實際上我需要從這裏填充我的ListView。

所以我做了什麼:

protected class ListFetcher extends AsyncTask<ArrayList,ArrayList,ArrayList>{ 
     String sid; 
     ArrayList list; 



     @Override 
     protected ArrayList doInBackground(ArrayList... params) { 
FTPClient client = new FTPClient(); 

      try { 

       client.connect(host,21); 
       client.login(user, pass); 
       client.setType(FTPClient.TYPE_BINARY); 
       client.changeDirectory("/"); 

       FTPFile[] files = client.list(); 
       String[] fileNames = new String[files.length]; 

       for (int i = 0; i < files.length; i++) 
       { 
        fileNames[i] = files[i].getName(); 
String logVariable=fileNames[i]; 
        Log.v(sid, logVariable); 
        values.add(fileNames[i]); 

       } 

       }catch (Exception e) 
      { 

       Log.v(sid,e.toString()); 
      } 





      return list; 
     } 

     protected void onPostExecute(final ArrayList result)//received result but didn't use it because in my case i don't need it instead of it i just updated my arraylist in doInbackground and updated my ui from here 
     { 


      adapter = new ArrayAdapter<String>(ListActivity.this, android.R.layout.simple_list_item_1, android.R.id.text1, values); 
      ListView listView =(ListView)findViewById(R.id.listView); 

      listView.setAdapter(adapter); 




     } 
+0

如果你在那裏設置'Adapter',那麼你就不需要調用'notifyDataSetChanged()'。那是因爲你已經在'ListView'上設置了它並且你更新了列表。 – codeMagic 2014-09-02 15:45:55