- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经创建了可扩展的 recylerview 以下是我的适配器代码
public class FoodMenuRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
List<Object> objects;
FoodMenuParentListener foodMenuParentListener;
boolean isAddAllowed;
boolean isVegOnly;
static final int TYPE_FOOD = 0;
static final int TYPE_MENU_ITEM = 1;
public FoodMenuRecyclerAdapter(List<Object> objects, FoodMenuParentListener foodMenuParentListener, boolean isVegOnly, boolean isAddAllowed) {
this.foodMenuParentListener = foodMenuParentListener;
this.isVegOnly = isVegOnly;
this.isAddAllowed = isAddAllowed;
this.objects = objects;
}
@Override
public int getItemViewType(int position) {
Object object = objects.get(position);
if (object instanceof FoodMenuItem) {
return TYPE_FOOD;
} else if(this.objects.get(position) == null) {
throw new IllegalStateException("Null object added");
}else {
return TYPE_MENU_ITEM;
}
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View view;
switch (getItemViewType(i)) {
case TYPE_FOOD:
view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_food_parent, viewGroup, false);
return new MenuViewHolder(view);
case TYPE_MENU_ITEM:
view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_food_child, viewGroup, false);
return new ChildMenuHolder(view);
default:
throw new IllegalArgumentException("Invalid viewType");
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
Object object = objects.get(i);
Context context = viewHolder.itemView.getContext();
Log.d("myAdapter","position"+ i + ":"+ ((getItemViewType(i) == TYPE_MENU_ITEM) ? "TYPE_MENU_ITEM" : "TYPE_FOOD"));
if (getItemViewType(i) == TYPE_MENU_ITEM) {
ChildMenuHolder childMenuHolder = (ChildMenuHolder) viewHolder;
Item item = (Item) object;
childMenuHolder.tvTitle.setText(item.getTitle());
childMenuHolder.txtQty.setText(String.valueOf(item.getQuatity()));
childMenuHolder.txtCartInc.setVisibility(item.isAddedToCart() ? View.VISIBLE : View.GONE);
childMenuHolder.txtQty.setVisibility(item.isAddedToCart() ? View.VISIBLE : View.GONE);
childMenuHolder.txtCartDec.setVisibility(item.isAddedToCart() ? View.VISIBLE : View.GONE);
childMenuHolder.btnAdd.setVisibility(!item.isAddedToCart() ? View.VISIBLE : View.GONE);
childMenuHolder.btnAdd.setBackgroundResource(isAddAllowed ? R.drawable.rounded_bottom_edge_shape_food : R.drawable.rounded_bottom_edge_shape_disable);
childMenuHolder.btnAdd.setTextColor(isAddAllowed ? ContextCompat.getColor(context, R.color.button_green) : ContextCompat.getColor(context, R.color.gray_a1));
childMenuHolder.ivType.setColorFilter(item.getType().equalsIgnoreCase(Item.FOOD_TYPE_VEG) ? ContextCompat.getColor(context, R.color.selected_green) : ContextCompat.getColor(context, R.color.app_red));
} else {
FoodMenuItem foodMenuItem = (FoodMenuItem) object;
MenuViewHolder menuViewHolder = (MenuViewHolder) viewHolder;
if (isVegOnly) {
List<Item> items = new ArrayList<>();
for (Item item : foodMenuItem.getItems()) {
if (item.getType().equalsIgnoreCase(Item.FOOD_TYPE_VEG)) {
items.add(item);
}
}
menuViewHolder.tvNumItems.setText("(" + items.size() + " items)");
} else {
menuViewHolder.tvNumItems.setText("(" + foodMenuItem.getItems().size() + " items)");
}
menuViewHolder.ivArrow.setImageResource(foodMenuItem.isExpanded() ? R.drawable.chev_up : R.drawable.chev_down);
menuViewHolder.tvTitle.setText(foodMenuItem.getCategoryName());
}
}
@Override
public int getItemCount() {
return objects.size();
}
public class MenuViewHolder extends RecyclerView.ViewHolder {
TextView tvTitle;
TextView tvNumItems;
ImageView ivArrow;
// RecyclerView rvMenu;
View rlArrow;
public MenuViewHolder(@NonNull View itemView) {
super(itemView);
tvTitle = (TextView) itemView.findViewById(R.id.tvTitle);
tvNumItems = (TextView) itemView.findViewById(R.id.tvNumItems);
ivArrow = (ImageView) itemView.findViewById(R.id.ivArrow);
// rvMenu.setNestedScrollingEnabled(false);
rlArrow = itemView.findViewById(R.id.rlArrow);
rlArrow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (foodMenuParentListener != null) {
Object object = objects.get(getAdapterPosition());
if (object instanceof FoodMenuItem) {
FoodMenuItem foodMenuItem = (FoodMenuItem) object;
foodMenuParentListener.OnExpandClick(foodMenuItem, getAdapterPosition());
}
}
}
});
tvTitle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (foodMenuParentListener != null) {
Object object = objects.get(getAdapterPosition());
if (object instanceof FoodMenuItem) {
FoodMenuItem foodMenuItem = (FoodMenuItem) object;
foodMenuParentListener.OnExpandClick(foodMenuItem, getAdapterPosition());
}
}
}
});
}
}
public boolean isVegOnly() {
return isVegOnly;
}
public void setVegOnly(boolean vegOnly) {
isVegOnly = vegOnly;
}
public interface FoodMenuParentListener extends AddItemListener {
public void OnExpandClick(FoodMenuItem foodMenuItem, int position);
public void OnVegOnlyClicked();
}
public class ChildMenuHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
ImageView ivType;
TextView tvTitle;
TextView tvPrice;
TextView txtCartDec;
TextView txtQty;
TextView txtCartInc;
Button btnAdd;
public ChildMenuHolder(@NonNull View itemView) {
super(itemView);
ivType = (ImageView) itemView.findViewById(R.id.ivType);
tvTitle = (TextView) itemView.findViewById(R.id.tvTitle);
tvPrice = (TextView) itemView.findViewById(R.id.tvPrice);
txtCartDec = (TextView) itemView.findViewById(R.id.txtCartDec);
txtQty = (TextView) itemView.findViewById(R.id.txtQty);
txtCartInc = (TextView) itemView.findViewById(R.id.txtCartInc);
btnAdd = (Button) itemView.findViewById(R.id.btnAdd);
btnAdd.setOnClickListener(this);
txtCartInc.setOnClickListener(this);
txtCartDec.setOnClickListener(this);
}
@Override
public void onClick(View view) {
}
}
public void setExpandIndex(int expandIndex) {
}
public boolean isItemExpanded(int position) {
return true;
}
public class VegOnlyViewHolder extends RecyclerView.ViewHolder {
Switch wtVeg;
public VegOnlyViewHolder(@NonNull View itemView) {
super(itemView);
wtVeg = (Switch) itemView.findViewById(R.id.wtVeg);
wtVeg.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (foodMenuParentListener != null) {
foodMenuParentListener.OnVegOnlyClicked();
}
}
});
}
}
public interface AddItemListener {
public void onAddClicked(Item item, int parentIndex);
public void increaseItemCount(Item item, int parentIndex);
public void decreaseItemCount(Item item, int parentIndex);
}
public void addAll(int position, List<Item> objectsToAdd) {
this.objects.addAll(position, objectsToAdd);
}
public void addItem(int position, Item object) {
this.objects.add(position, object);
}
public void removeItem(Object object) {
this.objects.remove(object);
}
public void removeAll(List<Item> objectsToRemove) {
objects.removeAll(objectsToRemove);
Log.d("myAdapter","item at first position after remove" + ":"+objects.get(0));
Log.d("myAdapter","item at second position after remove" + ":"+objects.get(1));
}
public Object isItemInList(Item item) {
for (Object object : objects) {
if (object instanceof Item && ((Item) object).getId().equals(item.getId())) {
return object;
}
}
return null;
}
}
以下是我的Fragment中展开折叠RecyclerView的代码
@Override
public void OnExpandClick(FoodMenuItem foodMenuItem, int position) {
if (recyclerViewMenu != null && recyclerViewMenu.getAdapter() != null) {
recyclerViewMenu.getRecycledViewPool().clear();
FoodMenuRecyclerAdapter foodMenuRecyclerAdapter = (FoodMenuRecyclerAdapter) recyclerViewMenu.getAdapter();
foodMenuItem.setExpanded(!foodMenuItem.isExpanded());
if (foodMenuItem.isExpanded()) {
foodMenuRecyclerAdapter.addAll(position + 1, foodMenuItem.getItems());
foodMenuRecyclerAdapter.notifyItemRangeInserted(position, foodMenuItem.getItems().size());
} else {
foodMenuRecyclerAdapter.removeAll(foodMenuItem.getItems());
foodMenuRecyclerAdapter.notifyItemRangeRemoved(position + 1, foodMenuItem.getItems().size());
}
}
}
下面是fragment中展开和折叠的监听代码
public void OnExpandClick(FoodMenuItem foodMenuItem, int position) {
if (recyclerViewMenu != null && recyclerViewMenu.getAdapter() != null) {
FoodMenuRecyclerAdapter foodMenuRecyclerAdapter = (FoodMenuRecyclerAdapter) recyclerViewMenu.getAdapter();
foodMenuItem.setExpanded(!foodMenuItem.isExpanded());
if (foodMenuItem.isExpanded()) {
foodMenuRecyclerAdapter.addAll(position + 1, foodMenuItem.getItems());
foodMenuRecyclerAdapter.notifyItemRangeInserted(position, foodMenuItem.getItems().size());
} else {
foodMenuRecyclerAdapter.removeAll(foodMenuItem.getItems());
foodMenuRecyclerAdapter.notifyItemRangeRemoved(position +1 , foodMenuItem.getItems().size());
}
}
}
上面的代码抛出异常,下面是异常堆栈跟踪
java.lang.ClassCastException: com.myapp.android.pojoentities.Item cannot be cast to com.myapp.android.pojoentities.FoodMenuItem
at com.myapp.android.food.menu.FoodMenuRecyclerAdapter.onBindViewHolder(FoodMenuRecyclerAdapter.java:104)
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781)
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823)
at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5752)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6019)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep1(RecyclerView.java:3875)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3639)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:4194)
at android.view.View.layout(View.java:16636)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at android.view.View.layout(View.java:16636)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
at android.view.View.layout(View.java:16636)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.support.design.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java:1183)
at android.support.design.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java:870)
at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:889)
at android.view.View.layout(View.java:16636)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at com.myapp.android.custom.FitsSystemWindowsFrameLayout.onLayout(FitsSystemWindowsFrameLayout.java:247)
at android.view.View.layout(View.java:16636)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1231)
at android.view.View.layout(View.java:16636)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at android.view.View.layout(View.java:16636)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
at android.view.View.layout(View.java:16636)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:336)
at android.widget.FrameLayout.onLayout(FrameLayout.java:273)
at android.view.View.layout(View.java:16636)
at android.view.ViewGroup.layout(ViewGroup.java:5437)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1743)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1586)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1495)
at android.view.View.layout(View.java:
更新:
折叠第一项后,我检查了列表中前两项类型的日志,发现前两项的类型为 ParentItem,即 FoodMenuItem 但是当我检查相同位置的 getItemViewType 日志时,它以某种方式返回了错误的值
以下是日志
05-28 00:13:47.643 32010-32010/com.myapp.android D/myAdapter: item at first position after remove:com.myapp.android.pojoentities.FoodMenuItem@7fdf002
05-28 00:13:47.643 32010-32010/com.myapp.android D/myAdapter: item at second position after remove:com.myapp.android.pojoentities.FoodMenuItem@9cbfd13
05-28 00:13:47.664 32010-32010/com.myapp.android D/myAdapter: position1:TYPE_FOOD
05-28 00:13:47.678 32010-32010/com.myapp.android D/myAdapter: position2:TYPE_MENU_ITEM
最佳答案
您获得了一个模型 foodmenuobject,然后在 onBindView 之后您直接将此对象更改为 items 。这就是您收到此错误的原因。
关于android - 自定义可扩展 RecyclerView 在 notifyItemRangeRemoved 和 notifyItemRangeInserted 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56326248/
我在另一个 RecyclerView(parentRecyclerView) 中实现了 RecyclerView(childRecyclerView),图片说明了所有的实现: 我想编写一个 espre
我正在构建一个应用程序,它使用ViewPager2在页面之间水平滚动,每个页面都有一个垂直滚动的内容RecyclerView,其中每个列表的第一个位置都有一行水平滚动小部件,例如附加到寻呼机指示器类型
我正在尝试实现一个水平的 recyclerview 并且 recyclerview 的每个项目都将是一个具有网格布局的垂直 recyclerview。我面临的问题是,当我尝试垂直滚动子 recycle
我使用显示条目列表的 RecyclerView。每个条目都托管另一个 RecyclerView,它是一个图像列表。 我现在想让这个嵌套的 RecyclerView 可点击,而不是它的项目,而是整个 V
我正在尝试将手机中的图像加载到我的回收 View 中。 到目前为止,我已经创建了一个 recyclerview.adapter 和一个 gridlayoutmanager,并将它们附加到我的 recy
我需要一个可扩展 View ,其中父/可扩展标题将具有文本和下拉箭头。每个此类标题的子项应该是在网格结构中具有多个项目的 View 。 (有点像带有 GridLayoutManager 的回收器 Vi
我正在使用显示不同类别列表的 RecyclerView。每行项目还包含 RecyclerView 以显示类别项目列表。父级 RecyclerView 由垂直 LinearLayoutManager 填
我正在更新一个旧的 Android 项目,现在我从 RecyclerView 中反复收到这条日志语句: W/RecyclerView:RecyclerView 不支持滚动到绝对位置。改为使用 scro
在我的 Adapter 中,我调用 LayoutManager.ChildAt(position) 来获取 itemview,但是我得到的 View 不是匹配的 itemview,当我调用 notif
我正在从 ListView 迁移到 RecyclerView,但是在 SQLite 中输入一些数据后,我的列表没有使用 notifyDataSetChanged() 更新;所以我总是要调用setAda
我正在用 Google Now Cards 的风格创建一组 5 张卡片。我首先关注的是总体布局。 我正在使用 CardView 和 RecyclerView ,我想要实现的是这样的: 这是我的 Car
在我的应用程序中,我有一个 RecyclerView,其中包含一个简单的项目 View ,每行包含一个 TextView 和一个 Spinner。 用户从操作栏中单击“保存”后,我需要遍历所有项目并获
我正在尝试检查 RecyclerView 中是否可以看到某些特定项目;但我无法实现。请帮助我确定我的项目是否在 RecyclerView 中完全可见。 mrecylerView.addOnScroll
我有一个提要片段,它的主要元素是帖子的 RecyclerView。 我正在使用 Lisa Wray 的 Groupie 库管理回收站 https://github.com/lisawray/group
我有这两个类似的行为回收器 View 适配器,它们之间的唯一区别是 onclick 方法和传递给它们的对象。所以,我正在考虑将类 B 设计为从回收器 View 适配器继承,这样我就可以更改构造函数来执
这很奇怪。我对这个问题感到沮丧。我将数据保存在 ArrayList 中。当我将数据放在 RecyclerView 上时。数据未显示在列表中。这是我的代码 listOrder.forEach { ord
编辑我通过使用 CoordinatorLayout 和 AppBarLayout 作为 header 和 TabLayout 的包装解决了这个问题。本来应该很明显,但是哦,好吧。 原始问题:我有一个设
我有一个回收 View 。我想从其适配器类更新回收器 View 。我尝试了 notiftDataSetChanged( ) 但它只适用于主类。下面是 recyclerview 适配器类的代码。 pac
我正在使用具有不同 viewholders 的 recyclerview(具有垂直 LinearLayout),其中一个有另一个 RecyclerView(带有水平 LL)。在第二个 recycler
我想创建一个与 Google Play Store 或 Netflix App 类似的布局,其中在单个 RecyclerView 中基本上有多个水平 RecyclerView。如果这不是他们做事的方式
我是一名优秀的程序员,十分优秀!