gpt4 book ai didi

android - 是否可以在回收站 View 适配器中使用三种 View 类型?

转载 作者:太空宇宙 更新时间:2023-11-03 13:48:29 25 4
gpt4 key购买 nike

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
};

}

上面的代码有没有错误? case position == 2 未在 getItemViewType() 中执行?
我尝试调试,但 position 总是以 01 的形式出现。
我在这里使用单一布局,单一 View 持有者。我正在做的是在 isFromMall 条件为 true 时显示/隐藏 View 。

最佳答案

您可以根据需要拥有任意数量的 ViewTypes。只需确保 getItemViewType 始终为您返回一个类型即可。然后您的逻辑可以为那些生成 ViewHolder。请记住,您必须在更改上述条件后立即通知适配器有关整个数据集的更改。

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

关于android - 是否可以在回收站 View 适配器中使用三种 View 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38139510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com