package com.vladstoick.Fragments; import android.app.Activity; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ListView; import com.actionbarsherlock.app.SherlockFragment; import com.vladstoick.DataModel.NewsDataSource; import com.vladstoick.DataModel.NewsItem; import com.vladstoick.DataModel.NewsSource; import com.vladstoick.Utils.Adapters.NewsItemAdapter; import com.vladstoick.stiridinromania.R; import com.vladstoick.stiridinromania.StiriApp; import butterknife.InjectView; import butterknife.Views; /** * A list fragment representing a list of NewsItems. This fragment * also supports tablet devices by allowing list items to be given an * 'activated' state upon selection. This helps indicate which item is * currently being viewed in a {@link com.vladstoick.Fragments.NewsItemDetailFragment}. * <p/> * Activities containing this fragment MUST implement the {@link Callbacks} * interface. */ public class NewsItemListFragment extends SherlockFragment implements AdapterView.OnItemClickListener{ @InjectView(R.id.newsitem_listview )ListView mListView; NewsSource ns; private static final String STATE_ACTIVATED_POSITION = "activated_position"; private Callbacks mCallbacks = null; private int mActivatedPosition = ListView.INVALID_POSITION; public interface Callbacks { public void onItemSelected(NewsItem newsItem, int position); } public static NewsItemListFragment newInstance(NewsSource newsSource) { NewsItemListFragment fragment = new NewsItemListFragment(); Bundle extras = new Bundle(); extras.putParcelable(NewsSource.TAG, newsSource); fragment.setArguments(extras); return fragment; } /** * Mandatory empty constructor for the fragment manager to instantiate the * fragment (e.g. upon screen orientation changes). */ public NewsItemListFragment() { } public void setNewsSourceId(int id) { this.ns = NewsDataSource.getInstance().getNewsSource(id); mListView.setAdapter(new NewsItemAdapter(getActivity(), ns.news)); } @Override public void onResume() { super.onResume(); if(mListView!=null && this.ns!=null){ this.ns = NewsDataSource.getInstance().getNewsSource(this.ns.getId()); NewsItemAdapter adapter = (NewsItemAdapter) mListView.getAdapter(); adapter.news = this.ns.news; adapter.notifyDataSetChanged(); } } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_newsitem_list,container,true); Views.inject(this,view); mListView.setOnItemClickListener(this); return view; } @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); // Restore the previously serialized activated item position. if (savedInstanceState != null && savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) { setActivatedPosition(savedInstanceState.getInt(STATE_ACTIVATED_POSITION)); } } @Override public void onAttach(Activity activity) { super.onAttach(activity); // Activities containing this fragment must implement its callbacks. if (!(activity instanceof Callbacks)) { throw new IllegalStateException("Activity must implement fragment's callbacks."); } mCallbacks = (Callbacks) activity; } @Override public void onDetach() { super.onDetach(); // Reset the active callbacks interface to the dummy implementation. mCallbacks = null; } @Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { mCallbacks.onItemSelected(ns.news.get(i),i); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (mActivatedPosition != ListView.INVALID_POSITION) { // Serialize and persist the activated item position. outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition); } } /** * Turns on activate-on-click mode. When this mode is on, list items will be * given the 'activated' state when touched. */ public void setActivateOnItemClick(boolean activateOnItemClick) { // When setting CHOICE_MODE_SINGLE, ListView will automatically // give items the 'activated' state when touched. mListView.setChoiceMode(activateOnItemClick ? ListView.CHOICE_MODE_SINGLE : ListView.CHOICE_MODE_NONE); } private void setActivatedPosition(int position) { if (position == ListView.INVALID_POSITION) { mListView.setItemChecked(mActivatedPosition, false); } else { mListView.setItemChecked(position, true); } mActivatedPosition = position; } }