ViewPager dentro do RecyclerView como item de linha
Eu preciso ter um ViewPager (semelhante a uma galeria horizontal) dentro de um RecyclerView que exibe uma lista verticalmente. Cada linha do RecyclerView terá um ViewPager que permitirá passar entre algumas imagens. O ViewPager também suporta eventos de clique que serão propagados para o RecyclerView pai.
Atualmente, tenho a seguinte implementação:
Adaptador de lista:
@Override
public void onBindViewHolder(MyHolder holder, int position) {
super.onBindViewHolder(holder, position);
Item listItem = get(position);
...
GalleryAdapter adapter =
new GalleryAdapter(getActivity().getSupportFragmentManager(),
item.mediaGallery);
holder.imageGallery.setAdapter(adapter);
...
}
Adaptador da galeria:
public class GalleryAdapter extends FragmentStatePagerAdapter {
private final List<Item.Gallery> mItems;
@Bind(R.id.gallery_item)
ImageView galleryView;
public SearchResultsGalleryPagerAdapter(FragmentManager fm, @NonNull ArrayList<Item.Gallery> mediaGallery) {
super(fm);
mItems = mediaGallery;
}
@Override
public Fragment getItem(int position) {
GalleryFragment fragment = GalleryFragment.newInstance(mItems.get(position));
...
return fragment;
}
@Override
public int getCount() {
return null == mItems ? 0 : mItems.size();
}
@Override
public int getItemPosition(Object object) {
//return super.getItemPosition(object);
return PagerAdapter.POSITION_NONE;
}
}
Fragmento da galeria:
public class GalleryFragment extends Fragment {
private static final String GALLERY_ITEM_BUNDLE_KEY = "gallery_item_bundle_key";
@Bind(R.id.gallery_item)
ImageView mGalleryView;
private Item.Gallery mGalleryItem;
// Empty constructor, required as per Fragment docs
public GalleryFragment() {}
public static SearchResultsGalleryFragment newInstance(Item.Gallery galleryItem) {
GalleryFragment fragment = new GalleryFragment();
// Add the item in the bundle which will be set to the fragment
Bundle bundle = new Bundle();
bundle.putSerializable(GALLERY_ITEM_BUNDLE_KEY, galleryItem);
fragment.setArguments(bundle);
return fragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGalleryItem = (Item.Gallery) getArguments().getSerializable(GALLERY_ITEM_BUNDLE_KEY);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_gallery_item, container, false);
ButterKnife.bind(this, view);
displayGalleryItem();
return view;
}
private void displayGalleryItem() {
if (null != mGalleryItem) {
Glide.with(getContext()) // Bind it with the context of the actual view used
.load(mGalleryItem.getImageUrl()) // Load the image
.centerCrop() // scale type
.placeholder(R.drawable.default_product_400_land) // temporary holder displayed while the image loads
.crossFade()
.into(mGalleryView);
}
}
}
O problema que estou tendo é que os fragmentos do ViewPager não são criados e exibidos corretamente. Às vezes, eles aparecem após uma rolagem manual (mas nem sempre); na maioria dos casos, eles não aparecem.
Alguém tem uma idéia do que eu implementei errado?