Android – can I use three view types in the recycle bin view Adapter?
•
Android
@H_419_2@public class StoreDetailAdapter extends RecyclerView.Adapter<StoreDetailAdapter.MyViewHolder> { private final int VIEW_TYPE_STORE_HEAD = 0; private final int VIEW_TYPE_CAT = 1; private final int VIEW_TYPE_PROD = 2; private List<Store.ProductType.ProductList> mPopularProducts = new ArrayList<>(); private List<Store.ProductType.ProductList> mPurchasedProducts = new ArrayList<>(); private Category@R_403_859@ mCategoryAdapter; private ProductCollectionAdapter mProductCollectionAdapter; private Context mContext; private List<Category> mCategories = new ArrayList<>(); private List<InStore> inStoreList = new ArrayList<>(); public class MyViewHolder extends RecyclerView.ViewHolder { public TextView categoryName; public TwoWayView items; LinearLayout containerheading; FrameLayout containerHeaderImage; ImageView imageView; private Store mStore; public MyViewHolder(View view) { super(view); items = (TwoWayView) view.findViewById(R.id.items_list); categoryName = (TextView) view.findViewById(R.id.category_name); containerheading = (LinearLayout) view.findViewById(R.id.container_linear_layout_heading); containerHeaderImage = (FrameLayout) view.findViewById(R.id.container_frame_layout_image); imageView = (ImageView) view.findViewById(R.id.image_store_icon); } } @Override public int getItemViewType(int position) { if(isFromMall){ if(position == 0) return VIEW_TYPE_STORE_HEAD; else if(position == 1) return VIEW_TYPE_CAT; else if(position == 2) return VIEW_TYPE_PROD; } else { return position==0 ? VIEW_TYPE_CAT :VIEW_TYPE_PROD; } return 0; } public StoreDetailAdapter(Context context, List<Category> categories, List<Store.ProductType.ProductList> products, Store.ProductType popularType, Store store) { mContext = context; mCategoryAdapter = new Category@R_403_859@(mContext, R.layout.view_category_item); mCategoryAdapter.clear(); mCategories = categories; mCategoryAdapter.notifyDataSetChanged(); mPopularProducts = products; notifyDataSetChanged(); mStore =store; } public StoreDetailAdapter(Context context, List<Category> categories, List<Store.ProductType.ProductList> popularProducts, List<Store.ProductType.ProductList> purchasedProducts, Store.ProductType popularType, Store.ProductType purchasedType) { mContext = context; mCategoryAdapter = new Category@R_403_859@(mContext, R.layout.view_category_item); mCategoryAdapter.clear(); mCategories = categories; mCategoryAdapter.notifyDataSetChanged(); mPopularProducts = popularProducts; mPurchasedProducts = purchasedProducts; notifyDataSetChanged(); } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View itemView = LayoutInflater.from(parent.getContext()) .inflate(R.layout.view_home_list_item, parent, false); return new MyViewHolder(itemView); } @Override public void onBindViewHolder(MyViewHolder holder, int position) { switch (getItemViewType(position)) { case VIEW_TYPE_STORE_HEAD: holder.containerHeaderImage.setVisibility(View.VISIBLE); holder.containerheading.setVisibility(View.GONE); holder.items.setVisibility(View.GONE); Picasso.with(getContext()) .load(mStore.getImageUriNew(Store.IMAGE_MD)) .into(holder.imageView); break; case VIEW_TYPE_CAT: holder.containerHeaderImage.setVisibility(View.GONE); holder.containerheading.setVisibility(View.GONE); mCategoryAdapter = new Category@R_403_859@(mContext, R.layout.view_category_item); holder.items.setAdapter(mCategoryAdapter); holder.items.setOnItemClickListener(mCategoryClickListener); mCategoryAdapter.addAll(mCategories); break; case VIEW_TYPE_PROD: if(mPopularProducts == null || mPopularProducts.isEmpty()){ holder.containerheading.setVisibility(View.GONE); break; } holder.containerHeaderImage.setVisibility(View.GONE); int pos = isFromMall()?position-2:position-1; if (pos < mPurchasedProducts.size()) { holder.categoryName.setText(mPurchasedProducts.get(pos).getTitle()); break; } holder.categoryName.setText(mPopularProducts.get(pos).getTitle()); inStoreList = mPopularProducts.get(pos).getInStores(); mProductCollectionAdapter = new ProductCollectionAdapter(getContext(), R.layout.view_store_detail_product_list_item); holder.items.setAdapter(mProductCollectionAdapter); holder.items.setOnItemClickListener(mProductClickListener); mProductCollectionAdapter.addAll(inStoreList); mProductCollectionAdapter.notifyDataSetChanged(); break; } } @Override public int getItemCount() { return isFromMall?2:1 + mPopularProducts.size() + mPurchasedProducts.size(); } private AdapterView.OnItemClickListener mCategoryClickListener = (parent, view, position, id) -> { //click implementation goes here } }; private AdapterView.OnItemClickListener mProductClickListener = (parent, view, position, id) -> { //todo click }; }
Is there any error in the above code? Position = = 2 is not executed in getitemviewtype()? I try to debug, but the location is always 0 or 1. I use a single layout and a single view holder here. What I'm doing is to show / hide the view if the isfrommall condition is true
resolvent:
You can have as many ViewTypes as you need. Just make sure that getitemviewtype always returns a type for you. And your logic can generate viewholders for those objects. Remember, once you change the above conditions, you must notify the adapter of the entire dataset change
@H_419_2@public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { @Override public int getItemViewType(int position) { // return your viewType here. make sure each position results in a viewType. // otherwise you may end up in exceptions as no ViewHolder can be generated afterwards return yourViewType; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //here you create the ViewHolders for the different viewTypes you have generated abvoe switch (viewType) { case 0: return new ViewHolder0(...); case 2: return new ViewHolder2(...); ... } } }
I have created a library that is responsible for all these things and forces correct use. You can find it here: fastadapter
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码