2011-08-12 16 views
3

我想從遠程服務器獲取一些信息,並在列表視圖中顯示該數據,我已經從服務器檢索到數據,但我不知道如何在列表視圖中顯示, 這裏是我的代碼,在這個代碼,我顯示一個列表視圖靜態數據,並試圖通過更新數據從服務器獲得該列表視圖,如何更新線程中的listview?

我不知道在哪裏更新列表視圖,請人幫我做這個

package com.listview; 

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.ListActivity; 
import android.net.ParseException; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.widget.AdapterView.OnItemClickListener; 

public class ListViewActivity extends ListActivity { 
/** Called when the activity is first created. */ 
private ThreadTest mThreadTest; 
ArrayList<String > arlist; 
public void onCreate(Bundle savedInstanceState) { 


     super.onCreate(savedInstanceState); 
     mThreadTest=new ThreadTest();  
     Thread tt=new Thread(mThreadTest); 
     tt.start(); 
//create a static arraylist to display it in listview 
     arlist = new ArrayList<String>(); 
     arlist.add("xxxxxxxxxxxx"); 
     arlist.add("yyyyyyyyyyyy"); 
     ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,R.layout.list_item, arlist); 
     setListAdapter(arrayAdapter);  
//create listview 

     ListView lv = getListView(); 
     lv.setTextFilterEnabled(true); 
     lv.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, 
      int position, long id) { 
// When clicked, show a toast with the TextView text 

      Toast.makeText(getApplicationContext(), ((TextView) view).getText(), 
       Toast.LENGTH_SHORT).show(); 
     } 
     }); 
    } 

static public class ThreadTest implements Runnable 
{ 
    ListViewActivity li=new ListViewActivity();    
    JSONArray jArray; 
    String result = null; 
    InputStream is = null; 
    StringBuilder sb=null; 
    public ArrayList al,arraylist; 
    public void run() 
    { 
//get some details from remote server as json string 

     ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
     try 
     { 

      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost("http://xxxxxxxxx/clients/yyyyyy/city.php"); 
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      HttpResponse response = httpclient.execute(httppost); 
      HttpEntity entity = response.getEntity(); 
      is = entity.getContent(); 
     } 
     catch(Exception e) 
     { 
      Log.e("log_tag", "Error in http connection "+e.toString()); 
     } 
     try{     
      BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); 
      sb = new StringBuilder(); 
      sb.append(reader.readLine() + "\n"); 
      String line="0"; 
      while ((line = reader.readLine()) != null) 
      { 
        sb.append(line ); 
      } 
      is.close(); 
      result=sb.toString(); 

/************************************** 
      * result is [{"city_id":"1","city_name":"madurai"},{"city_id":"2","city_name":"coimbatore"},{"city_id":"3","city_name":"chennai"}] 
      */ 

//parse the json string values 

      JSONArray array = new JSONArray(result); 
      for (int i = 0; i < array.length(); i++) 
      { 
       JSONObject row = array.getJSONObject(i); 
       int id = row.getInt("city_id");     
       String name = row.getString("city_name"); 
//add the cityname to arraylist to display it in listview after the thread exeucted 
       arraylist.add(name);              
      }    

     } 
     catch(Exception e) 
     { 
       Log.e("log_tag", "Error converting result "+e.toString()); 
     } 
    } 
} 

}

我已經找到一個很好的教程在http://www.sitepoint.com/loading-twitter-data-into-android-with-lists/要這樣做,

+0

對不起Ramamoorthy請嘗試更加具體,如果你問在計算器的問題。只是發佈代碼和希望解決方案將無法正常工作。 – Janusz

+0

我想創建一個線程的列表視圖,是否有可能這樣做? – Ramamoorthy

+0

只是一個友好的建議....請不要在一個問題中發佈數百行代碼。將示例代碼減少到足夠的代碼來展示您的問題。這樣你會得到更好的答案。請讀一下這篇文章:http://msmvps.com/blogs/jon_skeet/archive/2010/08/29/writing-the-perfect-question.aspx – Kev

回答

0

您可以使用Handler發送arraylist到主線程。

Handler mHandler = new Handler() { 
    public void handleMessage(Message msg) { 
    // create adapter and set to listview. 
    } 
}; 

static public class ThreadTest implements Runnable 
{ 

     ...... 
     ...... 

     JSONArray array = new JSONArray(result); 
     for (int i = 0; i < array.length(); i++) 
     { 
      JSONObject row = array.getJSONObject(i); 
      int id = row.getInt("city_id");     
      String name = row.getString("city_name"); 
      //add the cityname to arraylist to display it in listview after the thread exeucted 
      arraylist.add(name);              
     }    

     Message msg = new Message(); 
     msg.obj = arraylist; 
     mHandler.sendMessage(msg); 
} 
+0

我試圖將數組列表發送到主線程,但我不會工作.. – Ramamoorthy

+0

然後你做錯了某處。 – Ronnie

+2

嗨大家感謝您的大力幫助,它幫助我很多,並且我在http://www.sitepoint.com/loading-twitter-data-into-android-with-lists/ – Ramamoorthy

4

要更新UI,你應該調用一個UI線程的線程中像下面

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
      ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,R.layout.list_item, arlist); 
    setListAdapter(arrayAdapter); 
} 
}); 
+0

非常容易!用lambda表達式更好。 –

1
Oncreate(){ 
Thread th=new Thread(this); 
th.start(); 
} 

現在做除了UI任務線程的所有工作和所有的值保存到相應的變量。

void run(){ 
//fetch data from webservice 
handler.sendEmptymessage(0); 
} 

現在做UI的任務,如增加數據處理類

private Handler handler=new Handler(){ 
@Override 
public void onHandleMessage(){ 
//Update list 
} 
} 
+0

如果它解決了您的問題,請將其接受爲答案。 – Sameer

2

列出在這樣的情況下,我更喜歡使用的AsyncTask因爲它打破一切爲你,並保持整潔,舉辦。例如:

UpdateTask mTask = null; 
public void onCreate(Bundle savedInstanceState) { 
    // All of your onCreate code goes here 
    // ... 
    setListAdapter(arrayAdapter); 
    // ... 

    mTask = new UpdateTask(); 
    mTask.execute(); 
} 

public class UpdateTask extends AsyncTask<Void,Void,JSONArray> { 
    protected JSONArray doInBackground(Void... params) { 
     // Add your HTTPClient code here 
    } 

    protected void onPostExecute(JSONArray result) { 
     // Add code that loops through JSONArray and adds to adapter here 
     for (int i = 0; i < result.length(); i++) { 
      JSONObject row = result.getJSONObject(i); 
      int id = row.getInt("city_id");     
      String name = row.getString("city_name"); 
      //add the cityname to arraylist to display it in listview after the thread exeucted 
      arrayAdapter.add(name);              
     } 
    } 
} 

我試圖保持的例子短了點,但如果你需要做什麼更多的信息只是發表評論,我會盡力澄清。

-Dan

+0

我已經嘗試setListAdapter裏面onPostExecute我遇到了這個錯誤構造函數構造函數ArrayAdapter (CityActivity.UpdateTask,int,ArrayList)undefined – Ramamoorthy

+0

setListAdapter仍然應該在您的onCreate中調用它。 onPostExecute將遍歷JSONArray並將結果添加到適配器。我將更新上面的代碼以反映這一點。 – Dan

+0

我已經更新了代碼,我無法在此處創建列表視圖,查看此代碼並讓我知道我在此處所犯的錯誤。 – Ramamoorthy