Применение FragmentPagerAdapter к ViewPager

296
12 августа 2017, 01:55

Здравствуйте. Я недавно начал изучать JAVA и использовать Android Studio. Застрял на использовании адаптера для разных ViewPager, и буду очень благодарен, если поможете, так как уже пару дней изучаю всё связанное с вопросом, но знаний об истинной причине такого поведения компонентов не хватает.

Идея такова:

1) Лента записей (как в Instagram), прокручиваемая вверх-вниз.

2) Каждая запись имеет блок картинок, прокручиваемый влево-вправо, и текстовый блок.

Как это организовано:

1) На основном layout (ConstraintLayout) расположен nestedScrollView, в который через include добавлен LinearLayout. Это лента, которая будет елозить вверх-вниз.

2) LinearLayout наполняется (в цикле) записями. Запись представляет собой ConstraintLayout, на котором есть ViewPager и TextView.

3) В свежедобавленной записи ищется ViewPager, которому задается адаптер через setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager())).

4) MyFragmentPagerAdapter при getItem вызывает RecordImageFragment.newInstance.

5) RecordImageFragment при создании достает layout (FrameLayout), ищет на нём ImageView и лепит туда картинку.

Проблема:

Всё работает, но картинки видны только у первой записи. Когда запись создаётся, кроме манипуляций с адаптером для ViewPager, ищется TextView и ему задается текст. Текст от записи к записи разный и верный. А вот с ViewPager всё не так: у первой записи (т.е. во ViewPager у первой записи) показаны нужные картинки (их три, и они прокручиваются влево-вправо), а у остальных записей картинок не видно, НО адаптер у их ViewPager работает, OnPageChangeListener срабатывает (position: 0-2), как и у первой записи. После исследований оказалось, что RecordImageFragment при onCreateView через ViewGroup считает, что его ViewGroup.getRootView().getRootView() это - первая запись. И до сих пор я пытаюсь со всех сторон выяснить, почему содержимое фрагмента (FrameLayout) добавляется не к указанному ViewPager, а к первому.

Скриншоты:

Код MainActivity.java

package example; 
 
import android.os.*; 
import android.support.v4.app.*; 
import android.support.v4.view.*; 
import android.support.v7.app.AppCompatActivity; 
import android.util.*; 
import android.view.*; 
import android.widget.*; 
 
public class MainActivity extends AppCompatActivity { 
	@Override 
    protected void onCreate(Bundle savedInstanceState) 
	{ 
		super.onCreate(savedInstanceState); 
		setContentView(R.layout.main); 
		addRecords(); 
	} 
	 
	public void addRecords() 
	{ 
		for (int j = 1; j <= 10; j++  )  
		{ 
			addNewRecord(j); 
		} 
	} 
	public void addNewRecord(int id) 
	{ 
		LinearLayout records = (LinearLayout) findViewById(R.id.records); 
		// Добавляем новую record 
		LayoutInflater inflater = getLayoutInflater(); 
		View record = inflater.inflate(R.layout.record, null, false); 
		records.addView(record); 
		//Устанавливаем текст в текстовое поле 
		TextView title_tv = (TextView) record.findViewById(R.id.title); 
		title_tv.setText("Запись " + id); 
		//Ищем ViewPager, задаём адаптер, вешаем слушатель смены страниц 
		ViewPager pager = (ViewPager) record.findViewById(R.id.pager); 
		pager.setAdapter(new MyFragmentPagerAdapter(getSupportFragmentManager())); 
		pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() 
		{ 
			@Override 
			public void onPageSelected(int position) { Log.d("example", "Картинка сменилась на: " + position);} 
			@Override 
			public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {} 
			@Override 
			public void onPageScrollStateChanged(int state) {} 
		}); 
	} 
	 
	private class MyFragmentPagerAdapter extends FragmentPagerAdapter 
	{ 
		int[] internalPicts = {R.drawable.pict1, R.drawable.pict2, R.drawable.pict3}; 
		public MyFragmentPagerAdapter(FragmentManager fm) { super(fm); } 
		@Override 
		public Fragment getItem(int pos) { return RecordImageFragment.newInstance(internalPicts[pos]); } 
		@Override 
		public int getCount() { 
			return internalPicts.length; 
		} 
	} 
}

Код RecordImageFragment.java

package example; 
 
import android.os.Bundle; 
import android.support.v4.content.*; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 
 
public class RecordImageFragment extends android.support.v4.app.Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
        View layoutWithImage = inflater.inflate(R.layout.record_images_pager, container, false); 
		//Ищем картинку на layout и вставляем drawable 
		ImageView image = (ImageView) layoutWithImage.findViewById(R.id.image); 
		int imgId = getArguments().getInt("img"); 
		image.setImageDrawable(ContextCompat.getDrawable(getActivity(), imgId)); 
    	return layoutWithImage; 
    } 
 
    public static RecordImageFragment newInstance(int image) { 
		RecordImageFragment f = new RecordImageFragment(); 
        Bundle b = new Bundle(); 
        b.putInt("img", image); 
		f.setArguments(b); 
        return f; 
    } 
}

P.S. я понимаю, что внешние картинки надо загружать через ImageLoader, но тут - впиленные в проект.

READ ALSO
Автосоздание билдера IntelliJ IDEA

Автосоздание билдера IntelliJ IDEA

Можно ли как нить создать автоматически билдер класс, что б не писать все это ручками? Вот такое нужно

230
Выбор аккаунта для сохранения контакта

Выбор аккаунта для сохранения контакта

ЗдравствуйтеНебольшое предисловие: недавно заинтересовался разработкой приложений на андроид и решил начать с чего-нибудь простого, например...

309
Параметризованный тест в JUnit и Nan

Параметризованный тест в JUnit и Nan

ЗдравствуйтеПодскажите, как правильно обрабатывать тесты, когда тестируемая функция выдаёт разные по типу результаты

197
Как получить logcat удаленно?

Как получить logcat удаленно?

Скажите пожалуйста есть ли средство какое - нибудь чтобы получать логи, такие же как в LogCat

263