wawanopoulos
wawanopoulos

Reputation: 9794

onCreate vs onCreateView to integrate ActionBar-PullToRefresh

[UPDATE]

I have add onCreateView but now i get this error :

07-03 14:39:36.878: E/AndroidRuntime(30913): FATAL EXCEPTION: main
07-03 14:39:36.878: E/AndroidRuntime(30913): java.lang.RuntimeException: Content has view with id attribute 'android.R.id.list' that is not a ListView class
07-03 14:39:36.878: E/AndroidRuntime(30913):    at android.app.ListFragment.ensureList(ListFragment.java:402)
07-03 14:39:36.878: E/AndroidRuntime(30913):    at android.app.ListFragment.onViewCreated(ListFragment.java:203)
07-03 14:39:36.878: E/AndroidRuntime(30913):    at com.rss.alsace.AlsaceNewsFragment.onViewCreated(AlsaceNewsFragment.java:68)
07-03 14:39:36.878: E/AndroidRuntime(30913):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:843)
07-03 14:39:36.878: E/AndroidRuntime(30913):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035)
07-03 14:39:36.878: E/AndroidRuntime(30913):    at android.app.BackStackRecord.run(BackStackRecord.java:635)
07-03 14:39:36.878: E/AndroidRuntime(30913):    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1399)
07-03 14:39:36.878: E/AndroidRuntime(30913):    at android.app.FragmentManagerImpl$1.run(FragmentManager.java:426)
07-03 14:39:36.878: E/AndroidRuntime(30913):    at android.os.Handler.handleCallback(Handler.java:615)
07-03 14:39:36.878: E/AndroidRuntime(30913):    at android.os.Handler.dispatchMessage(Handler.java:92)
07-03 14:39:36.878: E/AndroidRuntime(30913):    at android.os.Looper.loop(Looper.java:137)
07-03 14:39:36.878: E/AndroidRuntime(30913):    at android.app.ActivityThread.main(ActivityThread.java:4921)
07-03 14:39:36.878: E/AndroidRuntime(30913):    at java.lang.reflect.Method.invokeNative(Native Method)
07-03 14:39:36.878: E/AndroidRuntime(30913):    at java.lang.reflect.Method.invoke(Method.java:511)
07-03 14:39:36.878: E/AndroidRuntime(30913):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
07-03 14:39:36.878: E/AndroidRuntime(30913):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
07-03 14:39:36.878: E/AndroidRuntime(30913):    at dalvik.system.NativeStart.main(Native Method)

I try to integrate ActionBar-PullToRefresh library (https://github.com/chrisbanes/ActionBar-PullToRefresh) in my android app.

My app is build with a menu (Navigation Drawer) on the left. When the user choose an item in the menu, an fragment is displayed on the main panel of my app.

Each fragment extends ListFragment. I try today to integrate ActionBar-PullToRefresh in these fragments.

Folowing the documentation of the library, i must integrate these line in onCreateView :

 @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            // Inflate the layout
            View view = inflater.inflate(R.layout.layout_fragment, container, false);

            // The ScrollView is what we'll be listening to for refresh starts
            ScrollView scrollView = (ScrollView) view.findViewById(R.id.ptr_scrollview);

            // Now get the PullToRefresh attacher from the Activity. An exercise to the reader
            // is to create an implicit interface instead of casting to the concrete Activity
            mPullToRefreshAttacher = ((FragmentTabsActivity) getActivity())
                    .getPullToRefreshAttacher();

            // Now set the ScrollView as the refreshable view, and the refresh listener (this)
            mPullToRefreshAttacher.setRefreshableView(scrollView, this);

            // Set title in Fragment for display purposes.
            TextView title = (TextView) view.findViewById(R.id.tv_title);
            title.setText(mTitle);

            return view;
        }

The problem is that in my class ListFragment, i only have onCreate method.

What can i use to integrate onCreateView method ?

Here is the compleete code of my class :

package com.rss.alsace;

import uk.co.senab.actionbarpulltorefresh.library.PullToRefreshAttacher;

import com.rss.utils.WebBrowserViewActivity;

import android.app.ListFragment;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ListView;


public class AlsaceNewsFragment extends ListFragment implements PullToRefreshAttacher.OnRefreshListener {

    private static final String STATE_ACTIVATED_POSITION = "activated_position";
    //private List<String> item = new ArrayList<String>();
    private int mActivatedPosition = ListView.INVALID_POSITION;
    private RssServiceAlsace rssService;
    private static final String URL_LALSACE = "http://www.lalsace.fr/actualite/alsace/rss";

    private PullToRefreshAttacher mPullToRefreshAttacher;

    public AlsaceNewsFragment() {
        // Empty constructor required for fragment subclasses
    }

    // Allow Activity to pass us it's PullToRefreshAttacher
    void setPullToRefreshAttacher(PullToRefreshAttacher attacher) {
        mPullToRefreshAttacher = attacher;
    }

    public void onRefreshStarted(View view) {
        /**
         * Simulate Refresh with 4 seconds sleep
         */
        new AsyncTask<Void, Void, Void>() {

            @Override
            protected Void doInBackground(Void... params) {
                refreshList();
                return null;
            }

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

                // Notify PullToRefreshAttacher that the refresh has finished
                mPullToRefreshAttacher.setRefreshComplete();
            }
        }.execute();
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);    
        refreshList();
    }


    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        if (savedInstanceState != null && savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) {
            setActivatedPosition(savedInstanceState.getInt(STATE_ACTIVATED_POSITION));
        }
    }

    public void setActivatedPosition(int position) {
        if (position == ListView.INVALID_POSITION) {
            getListView().setItemChecked(mActivatedPosition, false);
        } else {
            getListView().setItemChecked(position, true);
        }
        mActivatedPosition = position;
    }

    private void refreshList(){
        rssService = new RssServiceAlsace(this);
        rssService.execute(URL_LALSACE);
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // Do something with the data
        Log.d("DernieresNewsFragment", "Item cliqué ! Position=" +position);
        Intent intent = new Intent(getActivity(), WebBrowserViewActivity.class);
        ArticleAlsace article = (ArticleAlsace) this.getListAdapter().getItem(position);
        Log.d("DernieresNewsFragment", "Url chargée=" +article.getUrl());
        intent.putExtra("URL", article.getUrl());
        startActivity(intent);
    }

}

Upvotes: 2

Views: 2712

Answers (1)

Anup Cowkur
Anup Cowkur

Reputation: 20553

onCreateView() is used in the sample app because it is using fragments. You don't have to use it inside an Activity. See the usage section of the readme file - It shows how to use it in onCreate() of an activity.

Upvotes: 1

Related Questions