android-可以在回收站视图适配器中使用三种视图类型吗?
作者:互联网
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 CategoryListAdapter 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 CategoryListAdapter(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 CategoryListAdapter(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 CategoryListAdapter(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
};
}
上面的代码有什么错误吗?的情况下,位置== 2不在getItemViewType()中执行?
我尝试调试,但位置始终为0或1.
我在这里使用单一布局,单一视图持有人.我正在做的是如果isFromMall条件为true,则显示/隐藏视图.
解决方法:
您可以根据需要拥有任意多个ViewType.只要确保getItemViewType始终为您返回一个类型即可.并且您的逻辑可以为那些对象生成ViewHolders.请记住,一旦您更改了上述条件,就必须将整个数据集更改通知适配器.
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(...);
...
}
}
}
我创建了一个图书馆,负责所有这些事情,并强制正确使用.您可以在这里找到它:FastAdapter
标签:recycler-adapter,android-recyclerview,android 来源: https://codeday.me/bug/20191118/2028373.html