Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

View is null during onLoadMoreRequested ? #686

Closed
AruLNadhaN opened this issue Jan 1, 2017 · 5 comments
Closed

View is null during onLoadMoreRequested ? #686

AruLNadhaN opened this issue Jan 1, 2017 · 5 comments

Comments

@AruLNadhaN
Copy link

AruLNadhaN commented Jan 1, 2017

I'm trying to add Pull to Load more for my RecyclerView using setOnLoadMoreListener. The App works fine when it is first loaded. But it raises a NPE with my Viewholder View when it hits the onLoadMoreRequested . How can I solve this ?

01-01 12:24:13.576 14246-14246/? E/AndroidRuntime: FATAL EXCEPTION: main
                                                   Process: me.aruln PID: 14246
                                                   java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
                                                       at me.arulnadhaies.BrowseAdapter$ShotViewHolder.<init>(BrowseAdapter.java:161)
                                                       at me.arulnadwseAdapter.createBaseViewHolder(BrowseAdapter.java:50)
                                                       at me.arulnadhties.BrowseAdapter.createBaseViewHolder(BrowseAdapter.java:23)
                                                       at com.chad.library.adapter.base.BaseQuickAdapter.getLoadingView(BaseQuickAdapter.java:548)
                                                       at com.chad.library.adapter.base.BaseQuickAdapter.onCreateViewHolder(BaseQuickAdapter.java:527)
                                                       at com.chad.library.adapter.base.BaseQuickAdapter.onCreateViewHolder(BaseQuickAdapter.java:57)
                                                       at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6290)
                                                       at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5478)
                                                       at android.support.v7.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:270)
                                                       at android.support.v7.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:324)
                                                       at android.support.v7.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:337)
                                                       at android.support.v7.widget.GapWorker.prefetch(GapWorker.java:344)
                                                       at android.support.v7.widget.GapWorker.run(GapWorker.java:370)
                                                       at android.os.Handler.handleCallback(Handler.java:739)
                                                       at android.os.Handler.dispatchMessage(Handler.java:95)
                                                       at android.os.Looper.loop(Looper.java:135)
                                                       at android.app.ActivityThread.main(ActivityThread.java:5292)
                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                       at java.lang.reflect.Method.invoke(Method.java:372)
                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)

Adapter Code

public void setClickListener(ClickListener clickListener) {
        mClickListener = clickListener;
    }

   @Override
    protected ShotViewHolder createBaseViewHolder(View view) {
        return new ShotViewHolder(view);
    }

 @Override
    protected void convert(ShotViewHolder shotViewHolder, Items item) {

            shotViewHolder.mItem = item;
            shotViewHolder.prodName.setText(item.getName());
            shotViewHolder.prodPrice.setText( String.valueOf(item.getPrice()));
            shotViewHolder.prodUnit.setText(item.getUnit());
            if (item.isSelected()) {
                shotViewHolder.mAddCart.setVisibility(View.GONE);
                shotViewHolder.mPickerView.setVisibility(VISIBLE);
                shotViewHolder.mPicker.setValue(item.getAddedCount());
            } else {
                shotViewHolder.mPickerView.setVisibility(View.GONE);
            }
            Glide.with(shotViewHolder.itemView.getContext()).load(item.getImage())
                    .diskCacheStrategy(DiskCacheStrategy.SOURCE).into(shotViewHolder.prodImage);

    }

public class ShotViewHolder extends BaseViewHolder {
        ImageView prodImage;
        TextView prodPrice;
        TextView prodName;
        TextView prodUnit;
        View viewFooter;
        View mAddCart;
        View mPickerView;
        IncDecImageButton mPicker;
        Items mItem;

        public ShotViewHolder(View itemView) {
            super(itemView);
            prodImage= (ImageView)itemView.findViewById(R.id.image_shot);
            prodPrice= (TextView)itemView.findViewById(R.id.text_price);
            prodName= (TextView)itemView.findViewById(R.id.text_title);
            prodUnit= (TextView)itemView.findViewById(R.id.text_unit);
            viewFooter= (View)itemView.findViewById(R.id.layout_footer);
            mPickerView= (View)itemView.findViewById(R.id.quantity_picker);
            mPicker= (IncDecImageButton)itemView.findViewById(R.id.incdec);
            mAddCart= (View)itemView.findViewById(R.id.add_cart);
            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mClickListener != null) {
                        mClickListener.onShotClick(mItem);
                    }
                }
            });
            mAddCart.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mClickListener != null) {
                        mItem.setSelected(true);
                        mAddCart.setVisibility(View.GONE);
                        mPickerView.setVisibility(VISIBLE);
                        mClickListener.onCartAdd(mItem);
                    }
                }
            });
            mPicker.setOnValueChangeListener(new IncDecImageButton.OnValueChangeListener() {
                @Override
                public void onValueChange(IncDecImageButton view, float oldValue, float newValue) {
                    mItem.setAddedCount(newValue);
                    if(newValue == 0.0){
                        mItem.setSelected(false);
                        mClickListener.onCartRemove(mItem);
                        mPickerView.setVisibility(View.GONE);
                        mAddCart.setVisibility(VISIBLE);
                    }
                }
            });
        }
    }

Activity Code

@Override
    public void onLoadMoreRequested() {
        Timber.d("Lazy -> Method!"+ mCurrentCounter);
                if (mCurrentCounter >= TOTAL_COUNTER) {
                    Timber.d("Lazy -> loadMoreEnd!");
//                    mBrowseAdapter.loadMoreEnd();//default visible
                    mBrowseAdapter.loadMoreEnd(false);//true is gone,false is visible
                } else {
                    if (isErr) {
                        Timber.d("Lazy -> addData!");
                        mBrowseAdapter.addData(mBrowsePresenter.loadItems());
                        mCurrentCounter = mBrowseAdapter.getData().size();
                        mBrowseAdapter.loadMoreComplete();
                    } else {
                        isErr = true;
                        Timber.d("Lazy -> Error");
                        mBrowseAdapter.loadMoreFail();
                    }
                }
    }
@1109993488
Copy link
Collaborator

1109993488 commented Jan 2, 2017

You should override onCreateDefViewHolder, call setOnClickListener and setOnValueChangeListener in onCreateDefViewHolder

@AruLNadhaN
Copy link
Author

As you suggested, I tried to call setOnClickListener by overriding onCreateDefViewHolder. But I had some issues to intialize mItem & get itemView. How can i get them ?

@Override
 protected ShotViewHolder onCreateDefViewHolder(ViewGroup parent, int viewType) {

     IncDecImageButton mPicker;
     View mAddCart;
     Items mItem;
     View mPickerView;

     mPickerView = (View) parent.findViewById(R.id.quantity_picker);
     mPicker = (IncDecImageButton) parent.findViewById(R.id.incdec);
     mAddCart = (View) parent.findViewById(R.id.add_cart);

     itemView.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             if (mClickListener != null) {
                 mClickListener.onShotClick(mItem);
             }
         }
     });
     
     mAddCart.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             if (mClickListener != null) {
                 mItem.setSelected(true);
                 mAddCart.setVisibility(View.GONE);
                 mPickerView.setVisibility(VISIBLE);
                 mClickListener.onCartAdd(mItem);
             }
         }
     });

     mPicker.setOnValueChangeListener(new IncDecImageButton.OnValueChangeListener() {
         @Override
         public void onValueChange(IncDecImageButton view, float oldValue, float newValue) {
             mItem.setAddedCount(newValue);
             if(newValue == 0.0){
                 mItem.setSelected(false);
                 mClickListener.onCartRemove(mItem);
                 mPickerView.setVisibility(View.GONE);
                 mAddCart.setVisibility(VISIBLE);
             }
         }
     });
     return super.onCreateDefViewHolder(parent, viewType);
 }

@1109993488
Copy link
Collaborator

1109993488 commented Jan 2, 2017

ShotViewHolder holder = super.onCreateDefViewHolder(parent, viewType);

//holder.itemView
//holder.getView

return holder;

@1109993488
Copy link
Collaborator

Depending on your needs, you should override the convert method, setListener in the convert method, without rewriting the onCreateDefViewHolder

@AruLNadhaN
Copy link
Author

Thanks! It worked...

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants