14ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira/* 24ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * Copyright (C) 2011 The Android Open Source Project 34ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * 44ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * Licensed under the Apache License, Version 2.0 (the "License"); 54ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * you may not use this file except in compliance with the License. 64ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * You may obtain a copy of the License at 74ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * 84ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * http://www.apache.org/licenses/LICENSE-2.0 94ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * 104ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * Unless required by applicable law or agreed to in writing, software 114ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * distributed under the License is distributed on an "AS IS" BASIS, 124ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * See the License for the specific language governing permissions and 144ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * limitations under the License. 154ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira */ 164ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira 174ea24bff40770c987add689970c64cf63077dd3fBruno Oliveirapackage com.example.android.newsreader; 184ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira 194ea24bff40770c987add689970c64cf63077dd3fBruno Oliveiraimport android.os.Bundle; 204ea24bff40770c987add689970c64cf63077dd3fBruno Oliveiraimport android.support.v4.app.ListFragment; 214ea24bff40770c987add689970c64cf63077dd3fBruno Oliveiraimport android.view.View; 224ea24bff40770c987add689970c64cf63077dd3fBruno Oliveiraimport android.widget.AdapterView; 234ea24bff40770c987add689970c64cf63077dd3fBruno Oliveiraimport android.widget.AdapterView.OnItemClickListener; 244ea24bff40770c987add689970c64cf63077dd3fBruno Oliveiraimport android.widget.ArrayAdapter; 254ea24bff40770c987add689970c64cf63077dd3fBruno Oliveiraimport android.widget.ListView; 264ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira 274ea24bff40770c987add689970c64cf63077dd3fBruno Oliveiraimport java.util.ArrayList; 284ea24bff40770c987add689970c64cf63077dd3fBruno Oliveiraimport java.util.List; 294ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira 304ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira/** 314ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * Fragment that displays the news headlines for a particular news category. 324ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * 334ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * This Fragment displays a list with the news headlines for a particular news category. 344ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * When an item is selected, it notifies the configured listener that a headlines was selected. 354ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira */ 364ea24bff40770c987add689970c64cf63077dd3fBruno Oliveirapublic class HeadlinesFragment extends ListFragment implements OnItemClickListener { 374ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira // The list of headlines that we are displaying 384ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira List<String> mHeadlinesList = new ArrayList<String>(); 394ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira 404ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira // The list adapter for the list we are displaying 414ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira ArrayAdapter<String> mListAdapter; 424ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira 434ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira // The listener we are to notify when a headline is selected 444ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira OnHeadlineSelectedListener mHeadlineSelectedListener = null; 454ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira 464ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira /** 474ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * Represents a listener that will be notified of headline selections. 484ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira */ 494ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira public interface OnHeadlineSelectedListener { 504ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira /** 514ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * Called when a given headline is selected. 524ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * @param index the index of the selected headline. 534ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira */ 544ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira public void onHeadlineSelected(int index); 554ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira } 564ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira 574ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira /** 584ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * Default constructor required by framework. 594ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira */ 604ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira public HeadlinesFragment() { 614ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira super(); 624ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira } 634ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira 644ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira @Override 654ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira public void onStart() { 664ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira super.onStart(); 674ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira setListAdapter(mListAdapter); 684ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira getListView().setOnItemClickListener(this); 694ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira loadCategory(0); 704ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira } 714ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira 724ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira @Override 734ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira public void onCreate(Bundle savedInstanceState) { 744ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira super.onCreate(savedInstanceState); 754ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira mListAdapter = new ArrayAdapter<String>(getActivity(), R.layout.headline_item, 764ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira mHeadlinesList); 774ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira } 784ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira 794ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira /** 804ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * Sets the listener that should be notified of headline selection events. 814ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * @param listener the listener to notify. 824ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira */ 834ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira public void setOnHeadlineSelectedListener(OnHeadlineSelectedListener listener) { 844ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira mHeadlineSelectedListener = listener; 854ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira } 864ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira 874ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira /** 884ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * Load and display the headlines for the given news category. 894ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * @param categoryIndex the index of the news category to display. 904ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira */ 914ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira public void loadCategory(int categoryIndex) { 924ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira mHeadlinesList.clear(); 934ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira int i; 944ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira NewsCategory cat = NewsSource.getInstance().getCategory(categoryIndex); 954ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira for (i = 0; i < cat.getArticleCount(); i++) { 964ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira mHeadlinesList.add(cat.getArticle(i).getHeadline()); 974ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira } 984ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira mListAdapter.notifyDataSetChanged(); 994ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira } 1004ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira 1014ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira /** 1024ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * Handles a click on a headline. 1034ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * 1044ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * This causes the configured listener to be notified that a headline was selected. 1054ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira */ 1064ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira @Override 1074ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 1084ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira if (null != mHeadlineSelectedListener) { 1094ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira mHeadlineSelectedListener.onHeadlineSelected(position); 1104ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira } 1114ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira } 1124ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira 1134ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira /** Sets choice mode for the list 1144ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * 1154ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira * @param selectable whether list is to be selectable. 1164ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira */ 1174ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira public void setSelectable(boolean selectable) { 1184ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira if (selectable) { 1194ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 1204ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira } 1214ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira else { 1224ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira getListView().setChoiceMode(ListView.CHOICE_MODE_NONE); 1234ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira } 1244ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira } 1254ea24bff40770c987add689970c64cf63077dd3fBruno Oliveira} 126