3

Я пытался создать простую горизонтальную прокрутку. У меня есть 2 ListFragments, которые я бы хотел прокрутить.Источник не найден при использовании ListFragment & ViewPager

Я получаю ошибку «Источник не найден» при возврате функции «Просмотр из onCreateView».

Это мой MainActivity Класс:

public class MainActivity extends FragmentActivity implements ActionBar.TabListener { 

    AppSectionsPagerAdapter mAppSectionsPagerAdapter; 
    ViewPager mViewPager; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mAppSectionsPagerAdapter = new AppSectionsPagerAdapter(getSupportFragmentManager()); 
     final ActionBar actionBar = getActionBar(); 
     actionBar.setHomeButtonEnabled(false); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 
     mViewPager = (ViewPager) findViewById(R.id.pager); 
     mViewPager.setAdapter(mAppSectionsPagerAdapter); 
     mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       actionBar.setSelectedNavigationItem(position); 
      } 
     }); 
     for (int i = 0; i < mAppSectionsPagerAdapter.getCount(); i++) { 
      actionBar.addTab(
        actionBar.newTab() 
          .setText(mAppSectionsPagerAdapter.getPageTitle(i)) 
          .setTabListener(this)); 
     } 
    } 

    @Override 
    public void onTabUnselected(ActionBar.Tab tab, android.app.FragmentTransaction fragmentTransaction) { 
    } 

    @Override 
    public void onTabSelected(ActionBar.Tab tab, android.app.FragmentTransaction fragmentTransaction) { 
     // When the given tab is selected, switch to the corresponding page in the ViewPager. 
     mViewPager.setCurrentItem(tab.getPosition()); 
    } 

    @Override 
    public void onTabReselected(ActionBar.Tab tab, android.app.FragmentTransaction fragmentTransaction) { 
    } 

    public static class AppSectionsPagerAdapter extends FragmentPagerAdapter { 

     public AppSectionsPagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 
     Fragment a; 
     @Override 
     public Fragment getItem(int i) { 
      switch (i) { 
       case 0: 
        return new FragmentA(); 

       default: 
        return new FragmentB(); 
      } 
     } 

     @Override 
     public int getCount() { 
      return 2; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return "Section " + (position + 1); 
     } 
    } 
} 

Это один из моего класса ListFragment (вторая такая же, но с другим именем & расположение файла):

public class FragmentA extends ListFragment { 

     @Override 
      public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
       View rootView = inflater.inflate(R.layout.favorites_layout, container, false); 
       updateStationsView(0); 
       return rootView; 
      } 
} 

updateStationView это функция, которая заполняет список. удаление его не помогло, поэтому я подумал, что это безвредно.

Ошибка генерируется сразу после:

return rootView; 

, который возвращается к OnCreate функции MainActivity.

Когда я меняю ListFragment на простой фрагмент, он работает. Я думаю, что мне не хватает знаний, чтобы понять это. Я действительно хочу использовать ListFragment ...

Может кто-нибудь попробует помочь? Большое спасибо за ваши усилия.

Добавление XML-файлы:

activity_main.xml:

<android.support.v4.view.ViewPager xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

favorites_layout.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <ListView 
    android:id="@+id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 
</LinearLayout> 
+0

вы могли бы разместить в журнале ошибок? –

+0

Измените идентификатор вашего ListView на «android: id =» @ android: id/list « –

ответ

1

Я им вполне уверен, что проблема в том, что ваш пользовательский макет для ListFragment делает не содержат ListView. Эти строки кода вызывают ошибку, потому что вам нужно иметь ListView внутри вашего файла «favourites_layout» .xml.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.favorites_layout, container, false); 
     updateStationsView(0); 
     return rootView; 
} 

ListFragment имеет расположение по умолчанию, который состоит из одного списка. Однако, если вы желаете, вы можете настроить макет фрагмента на , возвращая свою собственную иерархию взглядов из onCreateView (LayoutInflater, ViewGroup, Bundle). Чтобы сделать это, ваша точка зрения иерархии должен содержать объект ListView с идентификатором «@android: ID/список» (или список, если он находится в коде)

Так ваш макет может, например, выглядеть следующим образом:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <ListView 
    android:id="@android:id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" /> 
</LinearLayout> 

Смотрите здесь больше: http://developer.android.com/reference/android/app/ListFragment.html

+0

Я изменил XML-файл, чтобы содержать LinearLayout с одним элементом ListView. См. Новый XML в основной теме. не помогло. – gioravered

+0

Пожалуйста, прочтите мой полный ответ. Вам нужно установить идентификатор вашего списка на «@android: id/list» –

+0

Прошу прощения, пропустил часть «android». Большое спасибо - он работает! – gioravered

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