大佬教程收集整理的这篇文章主要介绍了android – 在RecyclerView里面的ViewPager作为行项目,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
目前,我有以下实现:
列表适配器:
@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); ... }
图库适配器:
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; } }
图库片段:
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); } } }
我遇到的问题是ViewPager的片段没有正确创建和显示.有时它们出现在手动滚动之后(但并非总是如此),在大多数情况下它们根本不出现.
有没有人对我实施的错误有所了解?
import android.content.Context; import android.support.Annotation.NonNull; import android.support.v4.view.PagerAdapter; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import com.bumptech.glide.Glide; import com.bumptech.glide.load.DecodeFormat; import com.peoplepost.android.R; import com.peoplepost.android.common.listener.ItemClickSupport; import com.peoplepost.android.network.merv.model.Product; import java.util.ArrayList; import java.util.List; /** * <p> * Custom pager adapter which will manually create the pages needed for showing an slide pages gallery. * </p> * Created by Ionut Negru on 13/06/16. */ public class GalleryAdapter extends PagerAdapter { private static final String TAG = "GalleryAdapter"; private final List<Item> mItems; private final LayoutInflater mLayoutInflater; /** * The click event listener which will propagate click events to the parent or any other listener set */ private ItemClickSupport.SimpLeonItemClickListener mOnItemClickListener; /** * Constructor for gallery adapter which will create and screen slide of images. * * @param context * The context which will be used to inflate the layout for each page. * @param mediaGallery * The list of items which need to be displayed as screen slide. */ public GalleryAdapter(@NonNull Context context,@NonNull ArrayList<Item> mediaGallery) { super(); // Inflater which will be used for creaTing all the necessary pages mLayoutInflater = (LayoutInflater) context.getSystemservice(Context.LAYOUT_INFLATER_serviCE); // The items which will be displayed. mItems = mediaGallery; } @Override public int getCount() { // Just to be safe,check also if we have an valid list of items - never return invalid size. return null == mItems ? 0 : mItems.size(); } @Override public Boolean isViewFromObject(View view,Object object) { // The object returned by instantiateItem() is a key/identifier. This method checks whether // the View passed to it (represenTing the pagE) is associated with that key or not. // it is required by a PagerAdapter to function properly. return view == object; } @Override public Object instantiateItem(ViewGroup container,final int position) { // This method should create the page for the given position passed to it as an argument. // In our case,we inflate() our layout resource to create the hierarchy of view objects and then // set resource for the ImageView in it. // Finally,the inflated view is added to the container (which should be the ViewPager) and return it as well. // inflate our layout resource View itemView = mLayoutInflater.inflate(R.layout.fragment_gallery_item,falsE); // Display the resource on the view displayGalleryItem((ImageView) itemView.findViewById(R.id.gallery_item),mItems.get(position)); // Add our inflated view to the container container.addView(itemView); // Detect the click events and pass them to any listeners itemView.setOnClickListener(new View.onClickListener() { @Override public void onClick(View v) { if (null != mOnItemClickListener) { mOnItemClicklistener.onItemClicked(position); } } }); // Return our view return itemView; } @Override public void destroyItem(ViewGroup container,int position,Object object) { // Removes the page from the container for the given position. We simply removed object using removeView() // but Could’ve also used removeViewAt() by passing it the position. try { // Remove the view from the container container.removeView((View) object); // Try to clear resources used for displaying this view Glide.clear(((View) object).findViewById(R.id.gallery_item)); // Remove any resources used by this view unbindDrawables((View) object); // Invalidate the object object = null; } catch (Exception E) { Log.w(tag,"destroyItem: Failed to destroy item and clear it's used resources",E); } } /** * Recursively unbind any resources from the provided view. This method will clear the resources of all the * children of the view before invalidaTing the provided view itself. * * @param view * The view for which to unbind resource. */ protected void unbindDrawables(View view) { if (view.getBACkground() != null) { view.getBACkground().setCallBACk(null); } if (view instanceof ViewGroup) { for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) { unbindDrawables(((ViewGroup) view).getChildAt(i)); } ((ViewGroup) view).removeAllViews(); } } /** * Set an listener which will notify of any click events that are detected on the pages of the view pager. * * @param onItemClickListener * The listener. If {@code null} it will disable any events from being sent. */ public void setOnItemClickListener(ItemClickSupport.SimpLeonItemClickListener onItemClickListener) { mOnItemClickListener = onItemClickListener; } /** * Display the gallery imagE into the image view provided. * * @param galleryView * The view which will display the image. * @param galleryItem * The item from which to get the image. */ private void displayGalleryItem(ImageView galleryView,Item galleryItem) { if (null != galleryItem) { Glide.with(galleryView.getContext()) // Bind it with the context of the actual view used .load(galleryItem.getImageUrl()) // Load the image .asBitmap() // All our images are static,we want to display them as bitmaps .format(DecodeFormat.PREFER_RGB_565) // the decode format - this will not use alpha at all .centerCrop() // scale type .placeholder(R.drawable.default_product_400_land) // temporary holder displayed while the image loads .animate(R.anim.fade_in) // need to manually set the animation as bitmap cAnnot use cross fade .thumbnail(0.2f) // make use of the thumbnail which can display a down-sized version of the image .into(galleryView); // Voilla - the target view } } }
并且更新了父RecyclerView的onBindViewHolder():
@Override public void onBindViewHolder(MyHolder holder,position); Item listItem = get(position); ... GalleryAdapter adapter = new GalleryAdapter(getActivity(),product.mediaGallery); // Set the custom click listener on the adapter directly adapter.setOnItemClickListener(new ItemClickSupport.SimpLeonItemClickListener() { @Override public void onItemClicked(int position) { // inner view pager page was clicked } }); // Set the adapter on the view pager holder.imageGallery.setAdapter(adapter); ... }
我注意到内存使用量略有增加,但UI非常流畅.我想可以进一步优化保存多少页面以及如何销毁和恢复它们.
我希望这能帮助处于类似情况的其他人.
以上是大佬教程为你收集整理的android – 在RecyclerView里面的ViewPager作为行项目全部内容,希望文章能够帮你解决android – 在RecyclerView里面的ViewPager作为行项目所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。