FileDocCategorySizeDatePackage
MyRssReader2.javaAPI DocAndroid 1.5 API7119Wed May 06 22:41:08 BST 2009com.example.codelab.rssexample

MyRssReader2.java

/*
 * Copyright (C) 2007 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.codelab.rssexample;

import android.app.Activity;
import android.content.Context;
import android.graphics.Typeface;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
public class MyRssReader2 extends Activity{
    private ArrayList<RssItem> mFeeds = null;
    ListView mRssList = null;
    private Logger mLogger = Logger.getLogger("com.example.codelab.rssexample");
    
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);

        // Load screen layout.
        setContentView(R.layout.main_screen2);
        
       // Populate our list
        mFeeds = initializeList();
        mLogger.info("MyRssReader.onCreate-1  mFeeds value:" + mFeeds.size());
// BEGIN_INCLUDE(2_2)       
        // Populate ArrayAdapter and bind it to ListView
        mRssList = (ListView)findViewById(R.id.rssListView);
        if(mRssList == null){
            // Note: Calling showAlert() would fail here because dialogs opened
            // in onCreate won't be displayed properly, if at all.
            mLogger.warning("MyRssReader.onCreate-2 -- Couldn't instantiate a ListView!");
        }
        RssDataAdapter<RssItem> adap = new RssDataAdapter<RssItem>(this, R.layout.add_item, mFeeds);
        if(adap == null){
            mLogger.warning("MyRssReader.onCreate-3 -- Couldn't instantiate RssDataAdapter!");
        }
        if(mFeeds == null){
            mLogger.warning("MyRssReader.onCreate-4 -- Couldn't instantiate a ListView!");
        }
        mRssList.setAdapter(adap);   
// END_INCLUDE(2_2)
       
        mLogger.info("MyRssReader.onCreate-5 -- Loading preferences.");
        // Set the last selected item.
        // (icicle is only set if this is being restarted).
        if(savedInstanceState != null && savedInstanceState.containsKey("lastIndexItem"))
        {
            Integer selectedItem = savedInstanceState.getInteger("lastIndexItem");
            if(selectedItem >= 0 && selectedItem < mRssList.getChildCount()){
                mRssList.setSelection(savedInstanceState.getInteger("lastIndexItem"));
            }
            mLogger.info("MyRssReader.onCreate-6 -- Last selected item:" + selectedItem);
        }
    }
    
    // Store our state before we are potentially bumped from memory.
    // We'd like to store the current ListView selection.
    @Override
    protected void onSaveInstanceState(Bundle outState){
        int index = mRssList.getSelectedItemIndex();
        if(index > -1){
            outState.putInteger("lastIndexItem", index);
        }
    }
    
    
   
    // Add our initial menu options. We will tweak this menu when it's loaded swap out 
    // "start service" or "stop service", depending on whether the service is currently running.
    @Override
    public boolean onCreateOptionsMenu(Menu menu){
        // Always call the superclass implementation to 
        // provide standard items.
        super.onCreateOptionsMenu(menu);
        
        menu.add(0, 0, "Start RSS Service", null);
        menu.add(0, 1, "Stop RSS Service", null);
        menu.add(0, 2, "Add New Feed", null);
        menu.add(0, 3, "Delete Feed", null);
        menu.add(0, 4, "Update All Feeds", null);
        
        return true;
    }
    
    // Toggle out start service/stop service depending on whether the service is running.
    @Override
    public boolean onPrepareOptionsMenu(Menu menu){
        return true;
    }
    
    // Handle our menu clicks.
    @Override
    public boolean onOptionsItemSelected(Menu.Item item){
        switch (item.getId()){
            case 0:
              showAlert(null, "You clicked 'start'!", "ok", null, false, null);
              break;
            case 1:
              showAlert(null, "You clicked stop!", "ok", null, false, null);
              break;
            case 2:
                showAlert(null, "You clicked 'Add'!", "ok", null, false, null);
                break;
            case 3:
                showAlert(null, "You clicked 'Delete'!", "ok", null, false, null);
                break;
            case 4:
                showAlert(null, "You clicked 'Update'!", "ok", null, false, null);
                break;
            default:
                showAlert(null, "I have no idea what you clicked!", "ok", null, false, null);
                break;
            }
        return true;
    }
    
    
    // Our private ArrayAdapter implementation that returns a bold TextView for 
    // RSS items that are unread, or a normal TextView for items that have been read.
// BEGIN_INCLUDE(2_3)    
    private class RssDataAdapter<T> extends ArrayAdapter<T> {
        public RssDataAdapter(Context context, int resource, List objects) {
            super(context, resource, objects);
        }
// END_INCLUDE(2_3)       
        // Here's our only important override--returning the list item.
        @Override
        public View getView(int position, View convertView, ViewGroup parent){
            TextView view = null;
            // Get the item from the underlying array,
            // Create a TextView wrapper, and change the typeface, if necessary.
            RssItem item = (RssItem)this.getItem(position);
            if(item != null)
            {
                view = new TextView(parent.getContext());
                view.setText(item.toString());
                
                if(! item.hasBeenRead){
                    Typeface type = view.getTypeface();
                    view.setTypeface(Typeface.create(type, Typeface.BOLD_ITALIC));
                }
            }
            return view;    
        }
     }

//BEGIN_INCLUDE(2_1) 
    // Method to initialize our list of RSS items.
    private ArrayList<RssItem> initializeList(){
        ArrayList<RssItem> list = new ArrayList<RssItem>();
        list.add(new RssItem("http://www.sciam.com/xml/sciam.xml", "Scientific American"));
        list.add(new RssItem("http://newsrss.bbc.co.uk/rss/newsonline_world_edition/front_page/rss.xml", "BBC"));
        list.add(new RssItem("http://www.theonion.com/content/feeds/daily.", "The Onion"));
        list.add(new RssItem("http://feeds.engadget.com/weblogsinc/engadget", "Engadget"));
        return list;
    }
//END_INCLUDE(2_1)     
}