簡體   English   中英

RecyclerView 適配器 - onCreateViewHolder 收到未知的 viewType

[英]RecyclerView adapter - onCreateViewHolder receives unknown viewType

我在我的自定義適配器內的 function onCreateViewHolder 中遇到了一個奇怪的異常。 可能是因為 getItemViewType function 按預期返回了不同的值。

這是 getItemViewType function 的樣子:

private static final int TYPE_HEADER = 0;
private static final int TYPE_ITEM = 1;

@Override
public int getItemViewType(int position) {
  if (position == 0)
    return TYPE_HEADER;

  return TYPE_ITEM;
}

如您所見,它僅返回 0 或 1,沒有其他選項。

這是 onCreateViewHolder function 的樣子:

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
  if (viewType == TYPE_HEADER) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_groups, null);
    return new HeaderHolder(view);
  } else if(viewType == TYPE_ITEM) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.explore_group_row, null);
    return new ItemHolder(view);
  }

  throw new RuntimeException("there is no type that matches the type " + viewType + " make sure your using types correctly");
}

但是,我從 crashlytics 那里得到了一些崩潰,沒有與 viewTypes 6、7、8、11 等匹配的類型。不確定它從哪里來......此外,我無法重現這個問題,不想法它是如何發生的。

我在這個線程中看到了類似的問題,但沒有解決方案。

在這里您可以看到來自 crashlytics 的異常:

Fatal Exception: java.lang.RuntimeException: there is no type that matches the type 6 make sure your using types correctly
       at com.example.eliran.forum.GroupsFragment$GroupsAdapter.onCreateViewHolder(GroupsFragment.java:72)
       at androidx.recyclerview.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:5)
       at androidx.recyclerview.widget.RecyclerView$Recycler.a(RecyclerView.java:295)
       at androidx.recyclerview.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:14)
       at androidx.recyclerview.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:15)
       at androidx.recyclerview.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:22)
       at androidx.recyclerview.widget.GapWorker.a(GapWorker.java:3)
       at androidx.recyclerview.widget.GapWorker.run(GapWorker.java:71)
       at android.os.Handler.handleCallback(Handler.java:873)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:214)
       at android.app.ActivityThread.main(ActivityThread.java:7078)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)

這是適配器的完整代碼:

private class GroupsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

        private static final int TYPE_HEADER = 0;
        private static final int TYPE_ITEM = 1;

        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            if (viewType == TYPE_HEADER) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_groups, null);
                return new HeaderHolder(view);
            } else if(viewType == TYPE_ITEM) {
                View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.explore_group_row, null);
                return new ItemHolder(view);
            }

            throw new RuntimeException("there is no type that matches the type " + viewType + " make sure your using types correctly");
        }

        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int i) {
            if (holder instanceof ItemHolder) {
                ItemHolder theHolder = (ItemHolder) holder;
                Group group = groups.get(i - 1);
                theHolder.title.setText(group.getTitle());
                theHolder.description.setText(group.getDescription());

                if(group.getImage() != null) {
                    Picasso.get()
                            .load(group.getImage())
                            .fit()
                            .into(theHolder.image);
                } else {
                    Picasso.get()
                            .load(R.drawable.profile_picture_holder)
                            .fit()
                            .into(theHolder.image);
                }
            } else if (holder instanceof HeaderHolder){
                HeaderHolder theHolder = (HeaderHolder) holder;
                if (showMyGroupsPb) {
                    theHolder.myGroupsPb.setVisibility(View.VISIBLE);
                    theHolder.myGroupSectionHeader.setOnBtnListener(null);
                } else {
                    theHolder.myGroupsPb.setVisibility(View.GONE);
                    theHolder.myGroupSectionHeader.setOnBtnListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            Intent intent = new Intent(rootView.getContext(), MyGroupsActivity.class);
                            intent.putExtra("groups", myGroups);
                            startActivityForResult(intent, TheFinals.JOIN_LEAVE_GROUP_CODE);
                        }
                    });
                }
            }
        }

        @Override
        public int getItemViewType(int position) {
            if (position == 0)
                return TYPE_HEADER;

            return TYPE_ITEM;
        }

        @Override
        public int getItemCount() {
            return groups.size() + 1;
        }

        class HeaderHolder extends RecyclerView.ViewHolder {

            private ProgressBar myGroupsPb;
            private SectionHeader myGroupSectionHeader;

            public HeaderHolder(View view) {
                super(view);

                myGroupsRv = view.findViewById(R.id.groupsRecyclerView);
                myGroupsPb = view.findViewById(R.id.pb);
                LinearLayoutManager horizontalLayoutManager
                        = new LinearLayoutManager(rootView.getContext(), LinearLayoutManager.HORIZONTAL, false);
                myGroupsRv.setLayoutManager(horizontalLayoutManager);
                myGroupsRv.setAdapter(myGroupAdapter);
                myGroupSectionHeader = view.findViewById(R.id.myGroupSectionHeader);
            }


        }

        class ItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
            protected TextView title;
            protected ImageView image;
            protected TextView description;

            public ItemHolder(View view) {
                super(view);
                this.title = view.findViewById(R.id.title);
                this.image = view.findViewById(R.id.image);
                this.description = view.findViewById(R.id.description);
                view.setOnClickListener(this);
            }

            @Override
            public void onClick(View view) {
                int itemPosition = groupsRecyclerView.getChildLayoutPosition(view) - 1;
                selectedGroupIndex = itemPosition;
                Intent intent = new Intent(rootView.getContext(), GroupActivity.class);
                intent.putExtra("group", groups.get(itemPosition));
                startActivityForResult(intent, TheFinals.JOIN_LEAVE_GROUP_CODE);
            }
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM