0

У меня есть ViewPager с PagerTitleStrip, который заполнен FragmentStatePagerAdapter который заполнен фрагментами, которые содержат только один текст. Эти тексты хранятся в массиве текстов с 11 позициями, по одному на каждый фрагмент ViewPager.Как обновить только один фрагмент (страница/элемент) ViewPager?

Проблема в том, что некоторые тексты в массиве обновляются каждые X секунд, поэтому я должен найти способ обновления ТОЛЬКО фрагмент, соответствующий этому тексту. Когда я обновляю массив текстов, я знаю положение этого массива, поэтому я знаю номер фрагмента внутри viewpager, который необходимо обновить. но есть проблема, я не знаю, как обновить именно этот фрагмент.

Я только знаю, как обновить все из них в то же самое время, используя notifyDataSetChanged() и возвращение POSITION_NONE в getItemPosition моего FragmentStatePagerAdapter. Эта стратегия не работает, потому что все они обновляются и одновременно, и это порождает ненормальное поведение (прокрутка теряется на странице, которую вы видите, если вы просматриваете страницы, когда вызывается функция notifyDataSet, вы теряете свое движение , и т. д.)

Так что мне нужна помощь в этом, потому что я полностью потерял, как это решить.

Это мой текущий исходный код:

Это мой адаптер:

public class CollectionPagerAdapter extends FragmentStatePagerAdapter { 
    public CollectionPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int i) { 
     Fragment fragment = new ObjectFragment(); 
     Bundle args = new Bundle(); 
     args.putString(ObjectFragment.ARG_TEXT, children[i]); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public int getCount() { 
     return infoTitlesArray.length; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return infoTitlesArray[position]; 
    } 

    @Override 
    public int getItemPosition(Object object) { 
     return POSITION_NONE; 
    } 
} 

ViewPager, который имеет проблему:

<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"> 

     <android.support.v4.view.PagerTitleStrip 
      android:id="@+id/pager_title_strip" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="top" 
      android:paddingTop="4dp" 
      android:paddingBottom="4dp" 
      style="@style/CustomPagerTitleStrip"/> 
    </android.support.v4.view.ViewPager> 

макет фрагмента:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:scrollbarSize="5dip" 
    style="@style/CustomScrollBar"> 
    <TextView 
     android:id="@+id/text" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:gravity="left" 
     android:textSize="16sp" 
     android:padding="5dp" 
     style="@style/CustomTextView"/> 
</ScrollView> 

Большое спасибо.

+0

Пытались ли вы такое событие? – Eenvincible

+0

Не можете ли вы получить экземпляр фрагмента из адаптера? –

ответ

0

Фрагмент ViewPager можно найти с помощью тега,

В деятельности

Fragment fragmentToShow = getSupportFragmentManager().findFragmentByTag(
       mCollectionPagerAdapter.getFragmentTag(R.id.pager, position)); 

В FragmentStatePagerAdapter

public String getFragmentTag(int viewPagerId, int fragmentPosition) { 
    // This is the format in which FragmentStatePagerAdapter internally set's the fragment tag. 
    return "android:switcher:" + viewPagerId + ":" + fragmentPosition; 
    } 
+0

Можете ли вы адаптировать образец кода к исходному коду? Я не знаю, как его адаптировать. Кроме того, как только у вас есть фрагмент ... ¿как обновить его новым текстом? Как узнать, какая позиция массива верна для этого фрагмента? спасибо – NullPointerException

+0

Обновлен образец кода в исходный код, когда вы хотите обновить этот новый текст? это на смену страницы? – shekar

+0

Счастье не понимаю ваш пример кода. ¿Как, судя по всему, это соответствует моей проблеме? Что я должен делать с этим фрагментом, который у меня есть? Я не знаю, как перерисовать фрагмент. Есть ли что-то похожее на invalidate()? Также кажется немного хакером, чтобы получить фрагмент. Не безопаснее ли это сделать? – NullPointerException

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