Здравствуйте. Я недавно начал изучать 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, но тут - впиленные в проект.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Можно ли как нить создать автоматически билдер класс, что б не писать все это ручками? Вот такое нужно
ЗдравствуйтеНебольшое предисловие: недавно заинтересовался разработкой приложений на андроид и решил начать с чего-нибудь простого, например...
ЗдравствуйтеПодскажите, как правильно обрабатывать тесты, когда тестируемая функция выдаёт разные по типу результаты
Скажите пожалуйста есть ли средство какое - нибудь чтобы получать логи, такие же как в LogCat