0

Здравствуйте, спасибо вам за помощь!Фрагмент ActionBarSherlock, показывающий разные данные, чем прошло

Я пытаюсь создать приложение с ActionBarSherlcok. Когда я нажимаю вкладки, я хотел бы, чтобы один и тот же фрагмент создавал экземпляр, но с динамическими данными на основе вкладки, которую я нажал. По какой-то причине он продолжает показывать мне неправильные данные, хотя правильное значение параметра передается (я проверил его с помощью точек останова и часов). correct parameter value but wrong data

Я читал о SimpleOnPageChangeListener, getCurrentItem и конечно Fragments Tutorial. я опиралась на примере SwipeyTabs, чтобы создать это, и построил короткую демонстрацию, чтобы показать мою проблему здесь:

Это мой MainActivity.java

package il.co.gilead.testdynamicfragments; 

import com.actionbarsherlock.app.ActionBar; 
import com.actionbarsherlock.app.SherlockFragmentActivity; 

import android.os.Bundle; 
import android.support.v4.view.ViewPager; 

public class MainActivity extends SherlockFragmentActivity { 

    public static ViewPager mViewPager; 
    private TabsAdapter mTabsAdapter; 
    Integer intNumOfPages = 3; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     mViewPager = new ViewPager(this); 
     mViewPager.setId(R.id.pager); 
     setContentView(mViewPager); 
     final ActionBar bar = getSupportActionBar(); 
     bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     mTabsAdapter = new TabsAdapter(this, mViewPager); 
     for (int i=1; i<=intNumOfPages; i++) { 
      mTabsAdapter.addTab(bar.newTab().setText("Fragment "+i), 
       TestFrag.class, null); 
     } 
    } 
} 

Это мой TestFrag.java

package il.co.gilead.testdynamicfragments; 

import com.actionbarsherlock.app.SherlockFragment; 

import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

public class TestFrag extends SherlockFragment { 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.frag_test, container, false); 
     TextView tv = (TextView) v.findViewById(R.id.textView1); 
     Integer pos = (MainActivity.mViewPager.getCurrentItem() + 1); 
     tv.setText("Page " + pos.toString()); 
     return v; 
    } 
} 

Мой activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context=".MainActivity" > 

    <android.support.v4.view.ViewPager 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/pager" /> 

</RelativeLayout> 

и мой test_frag.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="TextView" /> 

</LinearLayout> 

Наконец мой TabsAdapter

public class TabsAdapter extends FragmentPagerAdapter implements ActionBar.TabListener, ViewPager.OnPageChangeListener{ 
    private final Context mContext; 
    private final ActionBar mActionBar; 
    private final ViewPager mViewPager; 
    private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); 

    static final class TabInfo{ 
     private final Class<?> clss; 
     private final Bundle args; 

     TabInfo(Class<?> _class, Bundle _args){ 
      clss = _class; 
      args = _args; 
     } 
    } 

    public TabsAdapter(SherlockFragmentActivity fa, ViewPager pager) { 
     super(fa.getSupportFragmentManager()); 
     mContext = fa; 
     mActionBar = fa.getSupportActionBar(); 
     mViewPager = pager; 
     mViewPager.setAdapter(this); 
     mViewPager.setOnPageChangeListener(this); 
    } 

    public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args){ 
     TabInfo info = new TabInfo(clss, args); 
     tab.setTag(info); 
     tab.setTabListener(this); 
     mTabs.add(info); 
     mActionBar.addTab(tab); 
     notifyDataSetChanged(); 
    } 

    @Override 
    public void onPageScrollStateChanged(int state) {  
    } 

    @Override 
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
    } 

    @Override 
    public void onPageSelected(int position) { 
     mActionBar.setSelectedNavigationItem(position); 
    } 

    @Override 
    public void onTabSelected(Tab tab, FragmentTransaction ft) { 
     mViewPager.setCurrentItem(tab.getPosition()); 
     Object tag = tab.getTag(); 
     for (int i = 0; i<mTabs.size(); i++){ 
      if (mTabs.get(i) == tag){ 
       mViewPager.setCurrentItem(i); 
      } 
     } 
    } 

    @Override 
    public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    } 

    @Override 
    public void onTabReselected(Tab tab, FragmentTransaction ft) { 
    } 

    @Override 
    public Fragment getItem(int position) { 
     TabInfo info = mTabs.get(position); 
     return Fragment.instantiate(mContext, info.clss.getName(), info.args); 
    } 

    @Override 
    public int getCount() { 
     return mTabs.size(); 
    } 
} 

Если вы будете играть с ним вокруг, вы увидите, что вкладка нажав «Фрагмент 2» иногда показывает «Страница 1», а иногда и показывает «Page 3» и иногда показывает «Страница 2». Я думаю, что это как-то связано с предварительной загрузкой фрагментов или обновлением фрагмента, но на данный момент я не знаю ...

Еще раз спасибо за вашу помощь!

ответ

0

Я обнаружил, что проблема была. Я просмотрел веб-сайт ActionBarSherlock и посмотрел пример кода. Реализация была иной, чем моя, но одна вещь встала. Вот изменения кода в MainActivity.java:

for (int i=1; i<=intNumOfPages; i++) 
{ 
    Bundle args = new Bundle(); 
    args.putInt("num", i); 
mTabsAdapter.addTab(bar.newTab().setText("Fragment "+i), TestFrag.class, args); 
} 

Вот дополнение к TestFrag.java:

public class TestFrag extends SherlockFragment { 
    Integer intPageNum; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     Bundle args = getArguments(); 
     if (args != null) 
      intPageNum = args.getInt("num"); 
     else 
      intPageNum = 1; 
    } 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.frag_test, container, false); 
     TextView tv = (TextView) v.findViewById(R.id.textView1); 
     tv.setText("Page " + intPageNum.toString()); 
     return v; 
    } 
} 

Как вы можете видеть, я уронил использование pos в целом. Спасибо, что пытались помочь!

0

Попробуйте изменить это:

Integer pos = (MainActivity.mViewPager.getCurrentItem() + 1); 

Для этого:

Integer pos = (getActivity().mViewPager.getCurrentItem() + 1); 
+0

, поэтому вы должны отличать getActivity() к MainActivity. Во всяком случае, это право. –

+0

Эмиль, изменяя то, что вы предложили, а также пытаетесь перейти на 'getSherlockActivity()', не компилируется с ошибкой: 'mViewPager не может быть разрешен или это не поле '. Кстати, у меня не было проблемы со значением 'pos' во время выполнения. Верно. Моя проблема заключается в том, что отображаемый текст не соответствует значению 'pos'. –

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