綁定帳號登入

Android 台灣中文網

打印 上一主題 下一主題

[求助] 如何使用listview顯示兩個string

[複製連結] 查看: 1553|回覆: 7|好評: 0
跳轉到指定樓層
樓主
wind8894 | 收聽TA | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
發表於 2012-9-30 22:41

馬上加入Android 台灣中文網,立即免費下載應用遊戲。

您需要 登錄 才可以下載或查看,沒有帳號?註冊

x
我現在可以抓到網頁的資料,放到listview上面,但是只能抓取一個欄位的string,如果要同時顯示userid跟text的List<String>要如何做呢?

我想要像這張圖的效果,上面顯示userid下面顯示text,能做到嗎?

「用Android 就來APK.TW」,快來加入粉絲吧!
Android 台灣中文網(APK.TW)
收藏收藏 分享分享 分享專題
用Android 就來Android 台灣中文網(https://apk.tw)
回覆

使用道具 舉報

沙發
不知火羽 | 收聽TA | 只看該作者
發表於 2012-9-30 23:06
本帖最後由 不知火羽 於 2012-9-30 23:38 編輯

你是用ArrayAdapter只能存一個欄位的資料
請改用SimpleAdapter試試看
首先先將抓下來資料一個一個的欄位和其值放到HashMap<String,String>內
再用ArrayList<HashMap<String,String>>將一筆一筆資料裝進去
再來是要準備1個Layout作為放資料的模版
最後再放進SimpleAdapter

SimpleAdapter的寫法外面有教學可以看


先宣告ArrayList<HashMap<String,String>>
  1. ArrayList<HashMap<String,String>> datas;
複製代碼
74行修改的部分

  1. public void Parser(String urlData){
  2.                 String temp = null;
  3.                 int end = 0;
  4.                 int start =0;
  5.                 int counter = 0;
  6.                 do{
  7.                        HashMap<String,String> hm = new HashMap<String,Object>(); //先實體化HashMap作為放資料的容器
  8.                         start = urlData.indexOf("<td>", end+1);
  9.                         end = urlData.indexOf("</td>", start+1);
  10.                         temp = urlData.substring(start+4, end);
  11.                         if ( !temp.equals("-") )
  12.                                  hm.put("userid",temp);    //將userid丟到HashMap
  13.                         else
  14.                                  hm.put("userid","");
  15.                         
  16.                         start = urlData.indexOf("<td>", end+1);
  17.                         end = urlData.indexOf("</td>", start+1);
  18.                         temp = urlData.substring(start+4, end);
  19.                         if ( !temp.equals("-") )
  20.                                   hm.put("text",temp);   //將text丟到HashMap
  21.                         else
  22.                                   hm.put("text","");
  23.                         datas.add(hm);   //將前面HashMap封裝的資料丟到ArrayList中(就是說將一筆資料轉成HashMap再丟進ArrayList)
  24.                         counter++;
  25.                 }while(counter < 10);
  26.     }
複製代碼
35行修改的部分
  1.     private void getdata()
  2.     {
  3.            ArrayList<HashMap<String,String>> datas = new ArrayList<HashMap<String,String>>();

  4.         String urlData = "";        
  5.             urlData = GetURLDate();
  6.             Parser(urlData);
  7.                
  8.                 final String[] items = {"userid","text"} //有幾個欄位就幾個欄位 請注意順序
  9.                 final int[] viewId = {R.id.textViewUserid,R.id.textViewText} //請建立一個新的Layout上面放兩的textView來作顯示userid和text使用
  10.                 final SimpleAdapter sa;        
  11.         sa = new SimpleAdapter(this, datas,R.layout.datas_list(你所創的layout名稱),items,viewId);
  12.         listView.setAdapter(sa);
  13.     }
複製代碼
Layout的做法就不多加說明 簡單來說就是開一個新的Layout
再拖兩個TextView進去(你要顯示多少資料欄位就拖都多少進來),TextView怎麼擺,你的ListView就怎麼顯示

上面 items和viewId這兩個陣列是互相對應的
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

板凳
 樓主| wind8894 | 收聽TA | 只看該作者
發表於 2012-9-30 23:43
本帖最後由 wind8894 於 2012-9-30 23:45 編輯

我照你上面這樣修改過後,會變得無法執行欸

是不是public class MysqltestActivity extends Activity

要改成public class MysqltestActivity extends ListActivity

還有81行,用object會錯誤,改成string就可以,是不是跟這邊有關呢?
HashMap<String,String> hm = new HashMap<String,String>();

  1. import java.io.BufferedReader;
  2. import java.io.InputStreamReader;
  3. import java.net.HttpURLConnection;
  4. import java.net.URL;
  5. import java.util.ArrayList;
  6. import java.util.HashMap;
  7. import java.util.List;
  8. import android.app.Activity;
  9. import android.os.Bundle;
  10. import android.util.Log;
  11. import android.widget.Button;
  12. import android.widget.ListView;
  13. import android.widget.SimpleAdapter;


  14. public class MysqltestActivity extends Activity {
  15.         Button button;
  16.         String WebURL ="http://192.192.155.75/listview.aspx";        
  17.         List<String> userid;
  18.         List<String> text;        
  19.         ArrayList<HashMap<String,String>> datas;
  20.         private ListView listView;
  21.         int itemIndex = 0;
  22.         
  23.     @Override
  24.     public void onCreate(Bundle savedInstanceState) {
  25.         super.onCreate(savedInstanceState);
  26.         setContentView(R.layout.main);
  27.         
  28.         listView=(ListView)findViewById(R.id.lva);        
  29.         getdata();
  30.     }   
  31.    
  32.     private void getdata()
  33.     {
  34.            ArrayList<HashMap<String,String>> datas = new ArrayList<HashMap<String,String>>();

  35.         String urlData = "";        
  36.             urlData = GetURLDate();
  37.             Parser(urlData);
  38.                
  39.                 final String[] items = {"userid","text"}; //有幾個欄位就幾個欄位 請注意順序
  40.                 final int[] viewId = {R.id.user_id,R.id.user_text}; //請建立一個新的Laylout上面放兩的textView來作顯示userid和text使用
  41.                 final SimpleAdapter sa;        
  42.         sa = new SimpleAdapter(this, datas,R.layout.user,items,viewId);
  43.         listView.setAdapter(sa);
  44.     }
  45.    
  46.    
  47.     public String GetURLDate()
  48.     {
  49.             String urlData = null;
  50.             try{
  51.                         HttpURLConnection httpUrlconnection = null;
  52.                         URL url = new URL(WebURL);
  53.                         httpUrlconnection = (HttpURLConnection)url.openConnection();
  54.                         httpUrlconnection.setDoInput(true);
  55.                         httpUrlconnection.setDoOutput(true);
  56.                         httpUrlconnection.connect();
  57.                         
  58.                         BufferedReader in = new BufferedReader(
  59.                                 new InputStreamReader(httpUrlconnection.getInputStream()));
  60.                                 String decodedString;
  61.                                 while ((decodedString = in.readLine()) != null) {
  62.                                         urlData += decodedString;
  63.                                 }
  64.                         in.close();
  65.                         httpUrlconnection.disconnect();
  66.                 }
  67.                 catch(Exception e){
  68.                         Log.e("ERROR", e.toString());
  69.                 }
  70.                 return urlData;
  71.     }  
  72.     public void Parser(String urlData){
  73.         String temp = null;
  74.         int end = 0;
  75.         int start =0;
  76.         int counter = 0;
  77.         do{
  78.                HashMap<String,String> hm = new HashMap<String,String>();
  79.                 start = urlData.indexOf("<td>", end+1);
  80.                 end = urlData.indexOf("</td>", start+1);
  81.                 temp = urlData.substring(start+4, end);
  82.                 if ( !temp.equals("-") )
  83.                          hm.put("userid",temp);
  84.                 else
  85.                          hm.put("userid","");
  86.                
  87.                 start = urlData.indexOf("<td>", end+1);
  88.                 end = urlData.indexOf("</td>", start+1);
  89.                 temp = urlData.substring(start+4, end);
  90.                 if ( !temp.equals("-") )
  91.                           hm.put("text",temp);
  92.                 else
  93.                           hm.put("text","");
  94.                 datas.add(hm);
  95.                 counter++;
  96.         }while(counter < 10);
  97. }
  98. }
複製代碼
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

地板
不知火羽 | 收聽TA | 只看該作者
發表於 2012-10-1 09:58
本帖最後由 不知火羽 於 2012-10-1 10:02 編輯

HashMap<String,String> hm = new HashMap<String,String>();
是HashMap<String,String>才對

如果是HashMap<String,Object>的話
可能是我筆誤 這點抱歉

這點非public class MysqltestActivity extends Activity
要改成public class MysqltestActivity extends ListActivity


其實不需要 如果你的layout有ListView其實不需要用到ListActivity

如果無法執行的話 請把LOG給我看 照道理應該是可以執行的
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

5
 樓主| wind8894 | 收聽TA | 只看該作者
發表於 2012-10-1 10:29
本帖最後由 wind8894 於 2012-10-1 10:31 編輯

我在想會不會是因為我用List<String> userid; 這樣宣告userid使 HashMap<String,String>在跑的時候出錯呢?

我去查了一下 似乎有HashMap<String,List<String>>這樣的用法
  1. 10-01 02:26:51.470: E/AndroidRuntime(410): FATAL EXCEPTION: main
  2. 10-01 02:26:51.470: E/AndroidRuntime(410): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mysqltest/com.mysqltest.MysqltestActivity}: java.lang.NullPointerException
  3. 10-01 02:26:51.470: E/AndroidRuntime(410):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)
  4. 10-01 02:26:51.470: E/AndroidRuntime(410):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)
  5. 10-01 02:26:51.470: E/AndroidRuntime(410):         at android.app.ActivityThread.access$1500(ActivityThread.java:117)
  6. 10-01 02:26:51.470: E/AndroidRuntime(410):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
  7. 10-01 02:26:51.470: E/AndroidRuntime(410):         at android.os.Handler.dispatchMessage(Handler.java:99)
  8. 10-01 02:26:51.470: E/AndroidRuntime(410):         at android.os.Looper.loop(Looper.java:123)
  9. 10-01 02:26:51.470: E/AndroidRuntime(410):         at android.app.ActivityThread.main(ActivityThread.java:3683)
  10. 10-01 02:26:51.470: E/AndroidRuntime(410):         at java.lang.reflect.Method.invokeNative(Native Method)
  11. 10-01 02:26:51.470: E/AndroidRuntime(410):         at java.lang.reflect.Method.invoke(Method.java:507)
  12. 10-01 02:26:51.470: E/AndroidRuntime(410):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
  13. 10-01 02:26:51.470: E/AndroidRuntime(410):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
  14. 10-01 02:26:51.470: E/AndroidRuntime(410):         at dalvik.system.NativeStart.main(Native Method)
  15. 10-01 02:26:51.470: E/AndroidRuntime(410): Caused by: java.lang.NullPointerException
  16. 10-01 02:26:51.470: E/AndroidRuntime(410):         at com.mysqltest.MysqltestActivity.Parser(MysqltestActivity.java:100)
  17. 10-01 02:26:51.470: E/AndroidRuntime(410):         at com.mysqltest.MysqltestActivity.getdata(MysqltestActivity.java:43)
  18. 10-01 02:26:51.470: E/AndroidRuntime(410):         at com.mysqltest.MysqltestActivity.onCreate(MysqltestActivity.java:33)
  19. 10-01 02:26:51.470: E/AndroidRuntime(410):         at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
  20. 10-01 02:26:51.470: E/AndroidRuntime(410):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)
  21. 10-01 02:26:51.470: E/AndroidRuntime(410):         ... 11 more
複製代碼
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

6
不知火羽 | 收聽TA | 只看該作者
發表於 2012-10-1 12:12
本帖最後由 不知火羽 於 2012-10-1 12:16 編輯

重點是這一個
ComponentInfo{com.mysqltest/com.mysqltest.MysqltestActivity}: java.lang.NullPointerException


請將36行
  1. ArrayList<HashMap<String,String>> datas = new ArrayList<HashMap<String,String>>();
複製代碼
改成
  1. datas = new ArrayList<HashMap<String,String>>();
複製代碼
就不會有問題了

datas已經在前面被宣告了 就不必getdata()內再被宣告 如過被後面的函數重新宣告的話 就會出現NullPointerException的錯誤
因為後面Parser(String urlData)抓不到getdata()內部宣告變數的值

另外
        List<String> userid;
        List<String> text;
並不需要到用到可以拿掉

因為SimpleAdapter是透過List<Map<String,Object>>的形式來送資料的

點評

太強了 受小弟一拜  發表於 2012-10-1 12:26

評分

參與人數 1幫助 +1 收起 理由
wind8894 + 1 偶像,看完你的內容,讓我找到了活著的意義.

查看全部評分

用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

7
 樓主| wind8894 | 收聽TA | 只看該作者
發表於 2012-10-1 14:56
本帖最後由 wind8894 於 2012-10-1 15:07 編輯

如果要做到當點擊某個listview欄位時

跳出一個dialog

但是裡面的內容怎麼不是listview上顯示的,而且有{userid=...,text=....}這樣


用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

8
 樓主| wind8894 | 收聽TA | 只看該作者
發表於 2012-10-1 15:45
用出來了

程式碼附上
  1. OnItemClickListener listener = new OnItemClickListener() {
  2.             public void onItemClick(AdapterView<?> parent, View view, int position,
  3.                 long id)
  4.             {              
  5.                     HashMap<String, String> hm = (HashMap<String,String>) listView.getItemAtPosition(position);
  6.                     new AlertDialog.Builder(MysqltestActivity.this).setTitle(hm.get("userid")).setMessage(hm.get("text")).show();   
  7.             }
  8.           };
  9.           listView.setOnItemClickListener(listener);
複製代碼
用Android 就來Android 台灣中文網(https://apk.tw)
回覆 支持 反對

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則