Android – can I use three view types in the recycle bin view Adapter?

@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
分享
二维码
< <上一篇
下一篇>>