开发者

How to load these elements to populate a list in android?

开发者 https://www.devze.com 2023-03-28 08:54 出处:网络
I am using this to get a list of elements from a webpage. http://www.gamespy.com/index/release.html // Get all the game elements

I am using this to get a list of elements from a webpage. http://www.gamespy.com/index/release.html

// Get all the game elements
Elements games = doc.select("div.FP_Up_TextWrap b");

 // Create new ArrayList
ArrayList<String> gameList = new ArrayList<String>();

// Iterator over those elements
ListIterator<Element> postIt = games.listIterator();

while (postIt.hasNext()) {
// Add the game text to the ArrayList
gameList.add(postIt.next().text());
}

This returns all the tags with which is what I want. But it returns the full tag with the title I just want the title the release date and a Img sr. I would like to return it to a list view. How would I go about doing t开发者_Python百科his? I maybe doing it totally wrong so you guys may want to check out the HTML page source.

EDIT - Gives me NullPointer error

  /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    outputTextView = (TextView)findViewById(R.id.outputTextView);

   ListView list = (ListView)findViewById(R.id.list);
   ArrayList<String> gameList = new ArrayList<String>();


      Document doc = null;
    try {
        doc = Jsoup.connect("http://www.gamespy.com/index/release.html").get();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
        // Get all td's that are a child of a row - each game has 4 of these
        Elements games = doc.select("tr > td.indexList1, tr > td.indexList2");
        // Iterator over those elements     
        ListIterator<Element> postIt = games.listIterator();          
        while (postIt.hasNext()) {     
             // Add the game text to the ArrayList     
             gameList.add(postIt.next().text());     
        }         

        String[] items = new String[gameList.size()];
        gameList.toArray(items);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_list_item_1, items);

    //  error points here    
             list.setAdapter(adapter);
    }


    }

EDIT - Layout for the list

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView  
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:id="@+id/outputTextView"
/>
<ListView    android:layout_height="wrap_content" android:id="@+id/list" android:layout_width="match_parent"></ListView>
</LinearLayout>


You won't be able to "return a list view" using this code, but you could create your own list view sub class which you could then return, following the same techniques:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    ListView listView1 = (ListView) findViewById(R.id.listView1);

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

    // Iterator over those elements     
    ListIterator<Element> postIt = games.listIterator();          
    while (postIt.hasNext()) {     
         // Add the game text to the ArrayList     
         gameList.add(postIt.next().text());     
    }         

    String[] items = new String[gameList.size()];
    gameList.toArray(items);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
                android.R.layout.some_list_item_view, items);

    listView1.setAdapter(adapter);
}

Ultimately what it comes down to is setting the list adapter for the list. If you need to create your own list adapter you can subclass and implement ListAdapter to databind other object types, but there's already a predefined adapter (ArrayAdapter) for handling simple string sets for ListView/ListActivity databinding.

UPDATE - Poster requested additional implementation details:

Given:

public class GameMeta {
    private String m_title;
    private java.util.Date m_releaseDate;

    public GameMeta() {
    }

    public String getTitle(){
         return m_title;
    }

    public void setTitle(String value) {
         m_title = value;
    }

    public java.util.Date getReleaseDate(){
         return m_releaseDate;
    }

    public void setReleaseDate(java.util.Date releaseDate){
         m_releaseDate = releaseDate;
    }
}

You might create the adapter:

public class GamesMetaAdapter implements Adapter extends ListAdapter {
     private ArrayList<GameMeta> m_list = new ArrayList<GameMeta>();
     private Context m_context = null;

     public GamesMetaAdapter(Context context) {
         m_context = context;
     }

     @Override
     public int getCount(){
          return m_list.size();
     }

     @Override
     public Object getItem(int position){
        if(position < m_list.size()){
          return m_list.getAt(position);
        }
        return null;
     }

     @Override
     public long getItemId(int position) {
        return (long)position;
     }

     @Override
     public int getItemViewType(int position) {
        return IGNORE_ITEM_VIEW_TYPE;
     }

     @Override
     public View getView (int position, View convertView, ViewGroup parent) {
             TextView simpleView = new TextView(this.m_context);
             String viewText = this.m_items[position].getTitle() + ", Released " + this.m_items[position].getReleaseDate().toString();

             simpleView.setText(this.m_items[position].getTitle());

             if(TextView.class.isInstance(convertView)) {
                   convertView = simpleView;
             }

             return simpleView;
     }


     @Override
     public int getViewTypeCount() {
        return 1;
     }

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

     @Override
     public boolean isEmpty() {
        return m_list.size() == 0;
     }

     @Override
     public void registerDataSetObserver (DataSetObserver observer) {

     }

     @Override
     public void unregisterDataSetObserver (DataSetObserver observer) {

     }

     /* LIST ADAPTER MEMBERS */
     @Override
     public boolean areAllItemsEnabled() {
          return true;
     }

     @Override
     public boolean isEnabled(int position) {
        return true;
     }    
}

I don't have a Java compiler here, so please don't ding me if this doesn't just copy/paste right into your project, but it should be well north of 90% there.

Happy coding.

B


This should gather the titles and release dates. Which image did you also want?

// Get all td's that are a child of a row - each game has 4 of these
Elements games = doc.select("tr > td.indexList1, tr > td.indexList2");

// Iterator over those elements
ListIterator<Element> gameIt = games.listIterator();

while (gameIt.hasNext()) {
    // Get the title of the game
    Element title = gameIt.next();

    System.out.println(title.text());

    // Unneeded elements
    Element platform = gameIt.next();
    Element genre = gameIt.next();

    // Get the release date of the game
    Element release = gameIt.next();
    System.out.println(release.text() + "\n@@@@@@");
}
0

精彩评论

暂无评论...
验证码 换一张
取 消