2013-07-03 2 views
2

[UPDATE]OnCreate против onCreateView интегрировать ActionBar-PullToRefresh

У меня есть добавить onCreateView, но теперь я получаю эту ошибку:

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) 

Я пытаюсь интегрировать ActionBar-PullToRefresh библиотека (https://github.com/chrisbanes/ActionBar-PullToRefresh) в мое приложение для Android.

Мое приложение построено с помощью меню (Ящик навигации) слева. Когда пользователь выбирает элемент в меню, фрагмент отображается на главной панели моего приложения.

Каждый фрагмент расширяет ListFragment. Я пытаюсь сегодня интегрировать ActionBar-PullToRefresh в эти фрагменты.

Folowing в documentation библиотеки, я должен интегрировать эти строки в 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; 
     } 

Проблема заключается в том, что в моем классе ListFragment, я только OnCreate метод.

Что я могу использовать для интеграции метода onCreateView?

Вот compleete код моего класса:

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); 
    } 

} 

ответ

1

onCreateView() используется в примере приложения, так как он использует фрагменты. Вам не нужно использовать его внутри Activity. См. usage section of the readme file - Он показывает, как использовать его в onCreate() деятельности.

+0

Спасибо, но я использую ListFragment, а не активность? – wawanopoulos

+0

ListFragment - это подкласс фрагмента, поэтому он будет иметь метод onCreateView(), который вы можете переопределить. В этом случае вы можете использовать образец, который вы упомянули в своем вопросе. –

+0

Я добавил onCreateView, но я получаю сообщение об ошибке. Не могли бы вы посмотреть, пожалуйста? Я обновил сообщение. – wawanopoulos

Смежные вопросы