2013-06-04 47 views
1

我今天问过类似的问题,其中问题是阵列适配器。 我已经尝试使用简单适配器设置列表视图,因为我需要标题行和含有内容的子行。列表视图与简单的适配器不显示文本

程序无误启动,但屏幕空白。

编辑:我更新的代码,它现在运行没有问题。我认为这个问题是在jsoup查询contentNode。

下面是代码:

package com.example.studentservis; 

    import java.util.ArrayList; 
    import java.util.HashMap; 
    import java.util.List; 
    import java.util.Map; 

    import android.R.string; 
    import android.os.AsyncTask; 
    import android.os.Bundle; 
    import android.os.Handler; 
    import android.app.Activity; 
    import android.content.Context; 
    import android.view.Menu; 
    import android.widget.ArrayAdapter; 
    import android.widget.ListView; 
    import android.widget.SimpleAdapter; 
    import android.widget.TextView; 
    import org.jsoup.Jsoup; 
    import org.jsoup.nodes.Document; 
    import org.jsoup.select.Elements; 

    public class MainActivity extends Activity { 



     List<String> headersList = new ArrayList<String>(); 
     List<String> contentList = new ArrayList<String>(); 
     ListView listview; 
     StableArrayAdapter adapter1; 
     String from[] = {"naslov","sadrzaj"}; 
     int [] to = { android.R.id.text1, android.R.id.text2 }; 

     SimpleAdapter simpleAdapter; 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 

      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 
      listview = (ListView) findViewById(R.id.listView1); 

      new SampleAsyncTask().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.activity_main, menu); 
      return true; 
     } 




     public class SampleAsyncTask extends AsyncTask<Void, Void, Void> { 

      @Override 
      protected Void doInBackground(Void... params) { 
       try { 
        webRequest(); 


       } catch (Exception e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       return null; 
      } 

      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 

      } 

      @Override 
      protected void onPostExecute(Void result) { 
       super.onPostExecute(result); 

       List<Map<String, String>> data = new ArrayList<Map<String, String>>(); 

       for(int i = 0; i < headersList.size(); i++) 
       { 
        Map<String,String>oglas = new HashMap<String,String>(2); 
        oglas.put("naslov", headersList.get(i)); 
        oglas.put("sadrzaj", contentList.get(i)); 
        data.add(oglas); 
       } 
       simpleAdapter = new SimpleAdapter(MainActivity.this, data, android.R.layout.simple_list_item_2, from, to); 

       listview.setAdapter(simpleAdapter); 
      } 

     } 



     private class StableArrayAdapter extends ArrayAdapter<String>{ 

      HashMap<String, Integer> mIdMap = new HashMap<String, Integer>(); 

      public StableArrayAdapter(Context context, int textViewResourceId, 
        List<String> objects) { 
       super(context, textViewResourceId, objects); 
       // TODO Auto-generated constructor stub 
       for (int i = 0; i < objects.size(); ++i) { 
        mIdMap.put(objects.get(i), i); 
       } 
      } 

      @Override 
      public long getItemId(int position) { 
       String item = getItem(position); 
       return mIdMap.get(item); 
      } 

      @Override 
      public boolean hasStableIds() { 
       return true; 
      } 
     } 



     public void webRequest() throws Exception{ 
      String servisURL = "http://www.sczg.unizg.hr/student-servis/"; 

      Document doc = Jsoup.connect(servisURL).get(); 

      Elements jobNode = doc.select("div.jobBox"); 
      Elements headersNode = jobNode.select("h1"); 
      Elements contentNode = jobNode.select("div.content"); 


      for(int i = 0; i < headersNode.size(); i++){ 
       headersList.add(headersNode.get(i).text()); 
      } 

      for(int i = 0; i < contentNode.size(); i++){ 
       contentList.add(contentNode.get(i).text()); 
      } 



     } 

    } 
+0

呼叫setUpSimpleAdapter();在onPostExecute()它将在UI线程中执行的位置。 – SKK

+0

@Santhosh我认为即时通讯使用'listview.setAdapter(simpleAdapter);''onPostExecute''做到这一点或者可能不是? :D – imot01

+0

但是,setUpSimpleAdapter()方法在doInBackground()中。所以,我的猜测是这可能是问题所在。您正在将适配器填充到后台AsyncTask线程中,并在UI线程中为listView设置适配器。所以出于这个原因,它可能不会在列表中显示任何数据。尝试一次。它只是一个预感。 – SKK

回答

1

不知道这是最好的方式。我修改了上述内容。您可以使用下面的参考。如果列表视图中的数据是正确的,请检查快照(因为我不理解文本数据)。如果列表中的数据不正确,请根据您的要求修改以下内容。

public class test extends Activity { 

String s; 
List<String> headersList = new ArrayList<String>(); 
List<String> contentList = new ArrayList<String>(); 
ListView listview; 

// List<Map<String, String>> data = new ArrayList<Map<String, String>>(); 
// List<Map<String, String>> data2 = new ArrayList<Map<String, String>>(); 
List<String> data = new ArrayList<String>(); 

SimpleAdapter simpleAdapter; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    listview = (ListView) findViewById(R.id.list); 

    new SampleAsyncTask().execute(); 


} 

public class SampleAsyncTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      webRequest(); 
      //setUpSimpleAdapter(); 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     // List<Map<String, String>> data = new ArrayList<Map<String, String>>(); 
     Map<String,String>oglas = new HashMap<String,String>(); 
     for(int i = 0; i < headersList.size(); i++) 
     { 
      data.add(headersList.get(i));  
     } 
     //my guess contentList is null. 
     // can't understand the contents. 
     // in that cases you can use headerList directly instead of adding to data 
     // used array adapter 
     ArrayAdapter<String> adapter1 = new ArrayAdapter<String> (test.this,android.R.layout.simple_list_item_1,data); 
     // instead of data you can use headerList. 
     listview.setAdapter(adapter1); 
     // listview.setAdapter(simpleAdapter); 
    } 

} 


public void webRequest() throws Exception{ 
    String servisURL = "http://www.sczg.unizg.hr/student-servis/"; 
    String response = Jsoup.connect(servisURL).response().toString(); 
    System.out.println(response); 
    Document doc = Jsoup.connect(servisURL).get(); 

    Elements jobNode = doc.select("div.jobBox"); 
    Elements headersNode = jobNode.select("h1"); 
    Elements contentNode = jobNode.select("content"); 


    for(int i = 0; i < headersNode.size(); i++){ 
     headersList.add(headersNode.get(i).text()); 
    } 

    for(int i = 0; i < contentNode.size(); i++){ 
     contentList.add(contentNode.get(i).text()); 
    } 
} 
} 

编辑:

问题是这样的

 Elements contentNode = jobNode.select("content"); 

这应该是

 Elements contentNode = jobNode.select("div.content"); 

你contentList是零,因为这(我猜)。

公共类测试延伸活动{

String s; 
List<String> headersList = new ArrayList<String>(); 
List<String> contentList = new ArrayList<String>(); 
ListView listview; 
List<Map<String, String>> data = new ArrayList<Map<String, String>>(); 

SimpleAdapter simpleAdapter; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    listview = (ListView) findViewById(R.id.list); 

    new SampleAsyncTask().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.activity_main, menu); 
    return true; 
} 




public class SampleAsyncTask extends AsyncTask<Void, Void, Void> { 

    @Override 
    protected Void doInBackground(Void... params) { 
     try { 
      webRequest(); 
      //setUpSimpleAdapter(); 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 

    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     List<Map<String, String>> data = new ArrayList<Map<String, String>>(); 
     for(int i = 0; i < headersList.size(); i++) 
     { 
      Map<String,String>oglas = new HashMap<String,String>(2); 
      oglas.put("naslov", headersList.get(i)); 
      oglas.put("sadrzaj", contentList.get(i)); 
      data.add(oglas); 
     } 
     simpleAdapter = new SimpleAdapter(test.this, data, 
       android.R.layout.simple_list_item_2, 
       new String[]{"naslov","sadrzaj"}, 
       new int[] {android.R.id.text1, android.R.id.text2}); 
     listview.setAdapter(simpleAdapter); 
    } 

} 


public void webRequest() throws Exception{ 
    String servisURL = "http://www.sczg.unizg.hr/student-servis/"; 
    String response = Jsoup.connect(servisURL).response().toString(); 
    System.out.println(response); 
    Document doc = Jsoup.connect(servisURL).get(); 

    Elements jobNode = doc.select("div.jobBox"); 
    Elements headersNode = jobNode.select("h1"); 
    //Elements contentNode = jobNode.select("content"); 
    Elements contentNode = jobNode.select("div.content"); 

    for(int i = 0; i < headersNode.size(); i++){ 
     headersList.add(headersNode.get(i).text()); 
    } 
    System.out.println("............."+contentNode.size()); 
    for(int i = 0; i < contentNode.size(); i++){ 
     contentList.add(contentNode.get(i).text()); 

    } 
} 
} 

enter image description here