java.lang.NullPointerException: попытка чтения из поля 'android.view.View android.support.v7.widget.RecyclerView $ ViewHolder.itemView'

1

Я использую Android RecyclerView с несколькими ViewHolders. Когда я устанавливаю адаптер, я получаю ошибку ниже:

java.lang.NullPointerException: Attempt to read from field 'android.view.View android.support.v7.widget.RecyclerView$ViewHolder.itemView' on a null object reference
                                                                                  at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6686)
                                                                                  at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5869)
                                                                                  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5752)
                                                                                  at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5748)
                                                                                  at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2232)
                                                                                  at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1559)
                                                                                  at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1519)
                                                                                  at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:614)
                                                                                  at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3812)
                                                                                  at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:3225)
                                                                                  at android.view.View.measure(View.java:22071)
                                                                                  at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
                                                                                  at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
                                                                                  at android.view.View.measure(View.java:22071)
                                                                                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
                                                                                  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
                                                                                  at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
                                                                                  at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
                                                                                  at android.view.View.measure(View.java:22071)
                                                                                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
                                                                                  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
                                                                                  at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
                                                                                  at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
                                                                                  at android.view.View.measure(View.java:22071)
                                                                                  at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1308)
                                                                                  at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                                                                                  at android.widget.ScrollView.onMeasure(ScrollView.java:350)
                                                                                  at android.view.View.measure(View.java:22071)
                                                                                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
                                                                                  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
                                                                                  at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
                                                                                  at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
                                                                                  at android.view.View.measure(View.java:22071)
                                                                                  at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
                                                                                  at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
                                                                                  at android.view.View.measure(View.java:22071)
                                                                                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
                                                                                  at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                                                                                  at android.view.View.measure(View.java:22071)
                                                                                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
                                                                                  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1514)
                                                                                  at android.widget.LinearLayout.measureVertical(LinearLayout.java:806)
                                                                                  at android.widget.LinearLayout.onMeasure(LinearLayout.java:685)
                                                                                  at android.view.View.measure(View.java:22071)
                                                                                  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6602)
                                                                                  at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                                                                                  at com.android.internal.policy.DecorView.onMeasure(DecorView.java:724)
                                                                                  at android.view.View.measure(View.java:22071)
                                                                                  at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2422)
                                                                                  at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1504)
                                                                                  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1761)
                                                                                  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1392)
                                                                                  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6752)
03-04 19:08:44.817 3862-3862/com.bocawestcc.cobaltmemberapp E/AndroidRuntime:     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
                                                                                  at android.view.Choreographer.doCallbacks(Choreographer.java:723)
                                                                                  at android.view.Choreographer.doFrame(Choreographer.java:658)
                                                                                  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
                                                                                  at android.os.Handler.handleCallback(Handler.java:790)
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                  at android.os.Looper.loop(Looper.java:164)
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:6494)
                                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                                  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)

Вот класс адаптера:

public class EventModifyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    final int VIEW_TYPE_MEMBER = 0;
    final int VIEW_TYPE_GUEST = 1;
    final int VIEW_TYPE_BUDDY = 2;

    private final static int TYPE_CALL=1,TYPE_SMS=2;
    private List<Object> modifyListData =new ArrayList();
    // Context is not used here but may be required to
    // perform complex operations or call methods from outside
    private Context context;

    // Constructor
    public EventModifyAdapter(Context context){
        this.context=context;
    }

    public void setEventModifyData(List<Object> modifyListData){
        this.modifyListData = modifyListData;
    }

    // We need to override this as we need to differentiate
    // which type viewHolder to be attached
    // This is being called from onBindViewHolder() method
    @Override
    public int getItemViewType(int position) {
        if (modifyListData.get(position) instanceof MemberList) {
            return VIEW_TYPE_MEMBER;
        } else if (modifyListData.get(position) instanceof GuestList) {
            return VIEW_TYPE_GUEST;
        } else if (modifyListData.get(position) instanceof BuddyList) {
            return VIEW_TYPE_BUDDY;
        }
        return -1;
    }

    // Invoked by layout manager to replace the contents of the views
    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
        int viewType=holder.getItemViewType();
        switch (viewType){
            case VIEW_TYPE_MEMBER:
                MemberList memberListList=(MemberList) modifyListData.get(position);
                ((MemberViewHolder)holder).showMemberDetails(memberListList);
                break;
            case VIEW_TYPE_GUEST:
                GuestList guestListList=(GuestList) modifyListData.get(position);
                ((GuestViewHolder)holder).showGuestDetails(guestListList);
                break;
            case VIEW_TYPE_BUDDY:
                BuddyList buddyList=(BuddyList) modifyListData.get(position);
                ((BuddyViewHolder)holder).showBuddyDetails(buddyList);
                break;
        }
    }

    @Override
    public int getItemCount(){return modifyListData.size();}

    // Invoked by layout manager to create new views
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // Attach layout for single cell
        int layout = 0;
        RecyclerView.ViewHolder viewHolder;
        // Identify viewType returned by getItemViewType(...)
        // and return ViewHolder Accordingly
        switch (viewType){
            case VIEW_TYPE_MEMBER:
                layout = R.layout.row_all_members;
                View membersView = LayoutInflater
                        .from(parent.getContext())
                        .inflate(layout, parent, false);
                viewHolder=new MemberViewHolder(membersView);
                break;
            case VIEW_TYPE_GUEST:
                layout = R.layout.row_all_guests;
                View guestsView = LayoutInflater
                        .from(parent.getContext())
                        .inflate(layout, parent, false);
                viewHolder=new GuestViewHolder(guestsView);
                break;
            case VIEW_TYPE_BUDDY:
                layout = R.layout.row_all_members;
                View buddyView = LayoutInflater
                        .from(parent.getContext())
                        .inflate(layout, parent, false);
                viewHolder=new BuddyViewHolder(buddyView);
                break;
            default:
                viewHolder=null;
                break;
        }
        return viewHolder;
    }

    // First ViewHolder of object type Call
    // Reference to the views for each call items to display desired information
    public class MemberViewHolder extends RecyclerView.ViewHolder {

        private TextView tv_member_name,tv_member_id;
        private ImageView iv_close;

        public MemberViewHolder(View itemView) {
            super(itemView);
            // Initiate view
            tv_member_name=(TextView)itemView.findViewById(R.id.tv_member_name);
            tv_member_id=(TextView)itemView.findViewById(R.id.tv_member_id);
            iv_close=(ImageView)itemView.findViewById(R.id.iv_close);
        }

        public void showMemberDetails(MemberList mem){
            // Attach values for each item
            String memName   = mem.getMemberName();
            String memid   = mem.getMemberID();
            tv_member_name.setText(memName);
            tv_member_id.setText(memid);

            iv_close.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int position = getAdapterPosition();
                    try {
                        modifyListData.remove(position);
                        notifyItemRemoved(position);
                    } catch (ArrayIndexOutOfBoundsException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }

    // Second ViewHolder of object type SMS
    // Reference to the views for each call items to display desired information
    public class GuestViewHolder extends RecyclerView.ViewHolder {

        private TextView tv_guest_name,tv_guestType;
        private ImageView iv_close;

        public GuestViewHolder(View itemView) {
            super(itemView);
            // Initiate view
            tv_guest_name =(TextView)itemView.findViewById(R.id.tv_guest_name);
            tv_guestType =(TextView)itemView.findViewById(R.id.tv_guestType);
            iv_close=(ImageView)itemView.findViewById(R.id.iv_close);
        }

        public void showGuestDetails(GuestList guest){
            // Attach values for each item
            String guestName   = guest.getGuestName();
            tv_guest_name.setText(guestName);
        }
    }

    // Second ViewHolder of object type SMS
    // Reference to the views for each call items to display desired information
    public class BuddyViewHolder extends RecyclerView.ViewHolder {

        private TextView tv_member_name,tv_member_id;
        private ImageView iv_close;

        public BuddyViewHolder(View itemView) {
            super(itemView);
            // Initiate view
            tv_member_name =(TextView)itemView.findViewById(R.id.tv_member_name);
            tv_member_id=(TextView)itemView.findViewById(R.id.tv_member_id);
            iv_close=(ImageView)itemView.findViewById(R.id.iv_close);
        }

        public void showBuddyDetails(BuddyList buddy){
            // Attach values for each item
            String buddyName   = buddy.getMemberName();
            String memid   = buddy.getMemberID();
            tv_member_name.setText(buddyName);
            tv_member_id.setText(memid);
        }
    }
}

Вот Адаптер Вызов или установка кода из активности:

  linearLayoutManager=new LinearLayoutManager(this);
        recyclerviewModify.setLayoutManager(linearLayoutManager);

        eventModifyAdapter =new EventModifyAdapter(EventRegistrationActivity.this);
        recyclerviewModify.setAdapter(eventModifyAdapter);

        eventModifyAdapter.setEventModifyData(finalModifyList);
        eventModifyAdapter.notifyDataSetChanged();

Пожалуйста, помогите мне от этой ошибки, потому что в logcat нет никакой подсказки, откуда происходит настоящая ошибка. Все предложения приветствуются.

Теги:

2 ответа

0

Удалите это, и оно будет работать нормально:

  default:
           viewHolder=null;
           break;

Это может произойти, если ваш onCreateViewHolder метод возвращает null.

0

Я сталкивался с этой же проблемой. Я использовал три видоискателя для хранения трех типов элементов. Оказывается, была проблема в getItemViewType (int position).

Просто убедитесь, что целое число, возвращаемое этим методом, ВСЕГДА является одним из типов представлений, которые вы определили.

Также убедитесь, что значение по умолчанию: значение, установленное внутри корпуса переключателя, если вы его использовали, НИКОГДА НЕ ИСПОЛЬЗУЕТСЯ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню