2013-01-10 54 views
0

我能夠從頁面中提取href元素並將結果存儲到字符串數組中。然後將其顯示在TextView中。如果我嘗試顯示ListView,問題來了。在這種情況下,我不知道如何使用ArrayAdapter。這是我的工作代碼,顯示到TextView中。帶字符串數組和Jsoup的ArrayAdapter

package com.example.jsouptestarray; 

import java.io.IOException; 
import java.util.ArrayList; 

import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 

import com.example.jsouptestarray.R; 


import android.os.AsyncTask; 
import android.os.Bundle; 
import android.app.Activity; 
import android.text.method.ScrollingMovementMethod; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 

public class MainActivity extends Activity { 

    TextView text; 
    ListView list; 

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

     new MyTask().execute(); 
    } 

    private class MyTask extends AsyncTask<Void, Void, ArrayList<String>> { 

     ArrayList<String> arr_linkText=new ArrayList<String>(); 

     @Override 
     protected ArrayList<String> doInBackground(Void... params) { 

      Document doc; 
      String linkText = ""; 

      try { 
       doc = Jsoup.connect("https://www.google.com/").get(); 
       Elements links = doc.getElementsByTag("a"); 
       for (Element el : links) { 
        linkText = el.attr("href"); 
        arr_linkText.add(linkText); // add value to ArrayList 
       } 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      return arr_linkText;  //<< retrun ArrayList from here 
     } 


     @Override 
     protected void onPostExecute(ArrayList<String> result) {   

      // get all value from result to display in TextView 
      for (String temp_result : result) { 
       System.out.println("links :: "+temp_result); 
       text = (TextView) findViewById (R.id.textView2); 
       text.append(temp_result + "\n" + "\n"); 
       text.setMovementMethod(new ScrollingMovementMethod()); 
      } 
     } 

    } 
} 

這是我嘗試使用ListView,但我得到一個錯誤,我不明白如何解決它。

list = (ListView) findViewById(R.id.listView1); 
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
      android.R.layout.simple_list_item_1, android.R.id.text1, temp_result); 

// Assign adapter to ListView 
list.setAdapter(adapter); 

以下是錯誤

enter image description here

我希望有人能幫助我解決這個問題的一個截圖,我很欣賞你的時間!

回答

2

構造函數的第四個元素在你的情況下是多餘的。它可以用於一次設置數據,您應該看到API。 試試這個:

list = (ListView) findViewById(R.id.listView1); 
ArrayAdapter<String> adapter = 
    new ArrayAdapter<String>(MainActivity.this, 
          android.R.layout.simple_list_item_1, 
          android.R.id.text1); 

for (String temp_result : result) 
{ 
    adapter.add(temp_result); 
} 

// Assign adapter to ListView 
list.setAdapter(adapter); 
+0

它仍然顯示相同的錯誤。 – Questions

+0

更新了答案,我忘記了另一條評論中提到的MainActivity.this –

2

this替換爲MainActivity.this。當你在AsyncTask中時,this引用AsyncTask實例,它不能傳遞給構造函數(不同的,不相關的,不兼容的類)

所以你需要調用一個Activity作爲參數,並且由於你的AsyncTask是Activity的一部分,可以用ClassName.this明確引用Activity實例。

+0

它給了我一個錯誤,請檢查我添加的圖片。 – Questions

+1

結合我們的答案,拿出一個參數並使用'MainActivity.this' –

+0

你們真棒。非常感謝! – Questions