HorizontalScrollView дублированный вид, когда в ViewPager

У меня есть HorizontalScrollView внутри RelativeLayout на двух страницах в ViewPager. Сначала все работает нормально, но когда я пролистываю страницы внутри ViewPager, а затем снова пытаюсь прокрутить HorizontalScrollView, представление дублируется следующим образом:введите описание изображения здесь

Так что это похоже на дублирование: один вид застрял на заднем плане, а второй на переднем плане нормально прокручивается.

Я пробовал несколько вещей, таких как игра с цветом фона, persistentDrawingCache, removeAllViews и добавление их снова, но это все еще происходит.

Можете ли вы помочь мне выяснить, что вызывает это и как это исправить? Большое спасибо!

Обновление: вот фрагменты кода

horizontal_scrollview_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scrollbars="none"
    android:overScrollMode="never"
    android:persistentDrawingCache="none"
    android:layout_centerHorizontal="true" >

    <LinearLayout
        android:id="@+id/horizontalScrollLinearLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal" />

</HorizontalScrollView>

horizontal_scrollview_child_layout.xml

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

    <com.xxx.CircularImageView
        android:id="@+id/contactPhotoImageView"
        android:layout_width="60dp"
        android:layout_height="60dp"
        android:src="@drawable/ic_launcher"
        app:border="true"
        app:border_color="@android:color/holo_blue_light"
        app:border_width="2dp"
        app:shadow="true" />

    <TextView
        android:id="@+id/contactNameTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Small Text"
        android:textAppearance="?android:attr/textAppearanceSmall" />

</LinearLayout>

HorizontalScrollViewFragment.java

public class HorizontalScrollViewFragment extends Fragment {
    private LinearLayout childLinearLayout;

    @Override
    public View onCreateView(final LayoutInflater inflater,
            final ViewGroup container, final Bundle savedInstanceState) {       
        final View rootView = inflater.inflate(
                R.layout.horizontal_scrollview_layout, container, false);

        contactsLinearLayout = (LinearLayout) rootView
                .findViewById(R.id.horizontalScrollLinearLayout);

        //ADDING CHILDREN HERE
        final View child1 = LayoutInflater.from(getActivity()).inflate(
                R.layout.horizontal_scrollview_child_layout, null);
        childLinearLayout.addView(child1);
        ...

        return rootView;
    }
}

DayViewFragment.java (фрагмент вставлен в ViewPager)

public class DayViewFragment extends Fragment {
    ...
    private HorizontalScrollViewFragment fragment;

    @Override
    public View onCreateView(final LayoutInflater inflater,
            final ViewGroup container, final Bundle savedInstanceState) {
        final View rootView = inflater.inflate(R.layout.day_item_layout,
                container, false);
        ...
        final FragmentManager fm = getChildFragmentManager();
        final FragmentTransaction ft = fm.beginTransaction();

        fragment = new HorizontalScrollViewFragment();
        ft.add(R.id.fragmentContainer, fragment);

        ft.commit();
        ...


        return rootView;
    }
}

1 ответ

Решение

Проблема возникла, когда фрагмент был воссоздан после того, как был достигнут предел количества экранов, которые должны быть сохранены ViewPager, и фрагмент, содержащий фрагмент, должен был быть воссоздан. Значение по умолчанию равно 1, поэтому мне нужно всего лишь изменить его на 2 (setOffscreenPageLimit(2)), так как у меня есть 3 фрагмента в ViewPager. Теперь проблема не возникает. Это не идеальное решение, но работает. В случае, если это не поможет никому другому: вам нужно контролировать, когда и как фрагмент воссоздан, и убедиться, что вид очищен.

Другие вопросы по тегам