Skip to content
This repository has been archived by the owner on Mar 16, 2024. It is now read-only.

Null object reference SectioningAdapter.getItemViewType(int) #18

Open
achinverma opened this issue Jul 20, 2016 · 9 comments
Open

Null object reference SectioningAdapter.getItemViewType(int) #18

achinverma opened this issue Jul 20, 2016 · 9 comments
Assignees

Comments

@achinverma
Copy link

Hi , i am using your lib to sticky header , i have an Tab layout with 2 fragments and when i try to get data from database in background and try to set adpater in the fragment onCreateView() method , i am getting

java.lang.NullPointerException: Attempt to invoke virtual method 'int org.zakariya.stickyheaders.SectioningAdapter.getItemViewType(int)' on a null object reference

Process: competent.groove.swalok, PID: 28820
java.lang.NullPointerException: Attempt to invoke virtual method 'int org.zakariya.stickyheaders.SectioningAdapter.getItemViewType(int)' on a null object reference
at org.zakariya.stickyheaders.StickyHeaderLayoutManager.getViewType(StickyHeaderLayoutManager.java:707)
at org.zakariya.stickyheaders.StickyHeaderLayoutManager.onLayoutChildren(StickyHeaderLayoutManager.java:183)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3028)
at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2906)
at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3283)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1695)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScrollingViewBehavior.java:122)
at android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavior.java:42)
at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(AppBarLayout.java:1170)
at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:814)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15671)
at android.view.ViewGroup.layout(ViewGroup.java:5038)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2086)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1843)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5885)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
at android.view.Choreographer.doCallbacks(Choreographer.java:580)
at android.view.Choreographer.doFrame(Choreographer.java:550)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
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:5254)
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:903)

in my fragment

public class GetStartedFragment extends Fragment{

RecyclerView recyclerView;
PersonalAdapter adapter;

DatabaseHelper db;
Database_Result db_insert;
ProgressDialog pd ;
SharedPreferences pref;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.personal_recyclerview, container, false);

    recyclerView = (RecyclerView) view.findViewById(R.id.personal_recycler);

    db = new DatabaseHelper(getActivity());
    db_insert = new Database_Result(getActivity());

    pref = PreferenceManager.getDefaultSharedPreferences(getActivity());

    adapter = new PersonalAdapter(getActivity());

    try {
        Thread thread = new Thread(){
            @Override
            public void run() {
                super.run();

                getActivity().runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        pd = ProgressDialog.show(getActivity(), "", "Loading messages...", true);
                        pd.setCancelable(false);
                        pd.setCanceledOnTouchOutside(false);
                        //bar.setVisibility(View.VISIBLE);
                    }
                });

                if(db_insert.isTableExists(DatabaseHelper.CALL_TABLE) == false){
                    boolean table = db_insert.Create_CALL_TABLE();
                    Log.e("-----isTableExists Create_CALL_TABLE-----", "="+table);
                }

                final List<Sms> lstSms = getAllSms();

                Log.e("==Personal Fragment=lstSms.size=====", "" + lstSms.size());

                db_insert.Update_DB_FLAG();

                db_insert.ADD_SMS_DATA(lstSms);

                try {
                    db_insert.Insert_CALLOG_DATA(Call_LogUtils.logCallLog(getActivity()));
                } catch (Exception e) {
                    e.printStackTrace();
                }



                    final List<Sms> SmsList = db_insert.getAllSMSList();
                    Log.e("=2==Personal=getAllSMSList===", "" + SmsList.size());


                adapter.setSMS(SmsList);

                Log.e("==setSMS==getAllSMSList===", "" + SmsList.size());

                    getActivity().runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

                            recyclerView.setLayoutManager(new StickyHeaderLayoutManager());

                            recyclerView.setAdapter(adapter);

                            pd.dismiss();

                        }
                    });

            }
        };
        thread.start();
    } catch (Exception e) {
        e.printStackTrace();
        //bar.setVisibility(View.GONE);
        pd.dismiss();
    }


    return view;
}
@achinverma
Copy link
Author

and my SectioningAdapter.java

public class PersonalAdapter extends SectioningAdapter {

Locale locale = Locale.getDefault();
static final boolean USE_DEBUG_APPEARANCE = false;
Context context;
SharedPreferences pref;

private class SectionSMS {
    String alpha;
    ArrayList<Sms> people = new ArrayList<>();
}
public class ItemViewHolder extends SectioningAdapter.ItemViewHolder {

    public TextView text_view, check_in_user_name, circle_view, sms_time;
    android.widget.ImageView ImageView,toggleimageView;

    public ItemViewHolder(View itemView) {
        super(itemView);
        ImageView = (ImageView) itemView.findViewById(R.id.textView2);
        toggleimageView = (ImageView) itemView.findViewById(R.id.toggleimageView);
        text_view = (TextView) itemView.findViewById(R.id.message_text);
        check_in_user_name = (TextView) itemView.findViewById(R.id.check_in_user_name);
        circle_view = (TextView) itemView.findViewById(R.id.chat_piechart);

        sms_time = (TextView) itemView.findViewById(R.id.sms_time);
    }
}

public class HeaderViewHolder extends SectioningAdapter.HeaderViewHolder {
    TextView header_date;

    public HeaderViewHolder(View itemView) {
        super(itemView);
        header_date = (TextView) itemView.findViewById(R.id.header_date);
    }
}

List<Sms> people;
ArrayList<SectionSMS> sections = new ArrayList<>();

public PersonalAdapter(Context context) {
    this.context = context;
    pref = PreferenceManager.getDefaultSharedPreferences(context);
    Log.e("==constructor=smsList=", "=======PersonalAdapter=========");
}


public void setSMS(List<Sms> SMSUsers){
    Log.e("==SMSUsers==", "==SMSUsers=="+SMSUsers.size() );
    try {
        this.people = SMSUsers;
        if(sections != null){
            sections.clear();
        }

        Log.e("==SMSUsers=="+people.size(), "" + SMSUsers.size());

        String  initialData = "";
        SectionSMS currentSection = null;
        for (Sms sms : SMSUsers) {
            if (!sms.getTime().equalsIgnoreCase(initialData)) {

                if (currentSection != null) {
                    sections.add(currentSection);
                }

                currentSection = new SectionSMS();
                initialData = sms.getTime();
                currentSection.alpha = String.valueOf(initialData);
            }

            if (currentSection != null) {
                currentSection.people.add(sms);
            }
        }

        sections.add(currentSection);
    } catch (Exception e) {
        e.printStackTrace();
    }
}


@Override
public int getNumberOfSections() {
    return sections.size();
}

@Override
public int getNumberOfItemsInSection(int sectionIndex) {
    return sections.get(sectionIndex).people.size();
}

@Override
public boolean doesSectionHaveHeader(int sectionIndex) {
    return true;
}

@Override
public boolean doesSectionHaveFooter(int sectionIndex) {
    return false;
}

@Override
public ItemViewHolder onCreateItemViewHolder(ViewGroup parent) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View v = inflater.inflate(R.layout.sms_item, parent, false);

    return new ItemViewHolder(v);
}

@Override
public HeaderViewHolder onCreateHeaderViewHolder(ViewGroup parent) {
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View v = inflater.inflate(R.layout.date_header, parent, false);

    return new HeaderViewHolder(v);
}

@SuppressLint("SetTextI18n")
@Override
public void onBindItemViewHolder(SectioningAdapter.ItemViewHolder viewHolder, final int sectionIndex, final int itemIndex) {

    SectionSMS s = sections.get(sectionIndex);

    ItemViewHolder holder = (ItemViewHolder) viewHolder;

    final Sms rowItem = s.people.get(itemIndex);


    //ivh.personNameTextView.setText(capitalize(person.get_msg()) + ", " + capitalize(person.get_msg()));
    /*ivh.personNameTextView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            Log.e("=OnClickListener=" + itemIndex, sectionIndex + "||" + person.get_msg());

        }
    });*/




    //"0" for have not read sms and "1" for have read sms
    if(rowItem.getReadState().equalsIgnoreCase("1")){
        if(rowItem.getCalltype().equalsIgnoreCase("sms")){

            holder.text_view.setText(rowItem.getMsg());
            holder.ImageView.setImageResource(R.drawable.ic_textsms_white_24dp);


            String isDialerEnable = pref.getString(PrefsConstants.Dialer, "");
            if(isDialerEnable.equalsIgnoreCase(context.getString(R.string.check))){
                holder.toggleimageView.setImageResource(R.drawable.ic_call_white_24dp);
                holder.toggleimageView.setVisibility(View.VISIBLE);
            }else{
                holder.toggleimageView.setVisibility(View.INVISIBLE);
            }

        }else{

            holder.ImageView.setImageResource(R.drawable.ic_call_white_24dp);
            holder.toggleimageView.setImageResource(R.drawable.ic_textsms_white_24dp);
            holder.text_view.setText(rowItem.getCalltype());
        }

        holder.text_view.setTextColor(Color.parseColor("#7d7d7d"));
        holder.text_view.setTypeface(null, Typeface.NORMAL);

    }else{

        if(rowItem.getCalltype().equalsIgnoreCase("sms")){
            holder.text_view.setText(rowItem.getMsg());
            holder.ImageView.setImageResource(R.drawable.ic_textsms_white_24dp);
            holder.toggleimageView.setImageResource(R.drawable.ic_call_white_24dp);


            String isDialerEnable = pref.getString(PrefsConstants.Dialer, "");
            if(isDialerEnable.equalsIgnoreCase(context.getString(R.string.check))){
                holder.toggleimageView.setVisibility(View.VISIBLE);
                holder.toggleimageView.setImageResource(R.drawable.ic_call_white_24dp);
            }else{
                holder.toggleimageView.setVisibility(View.INVISIBLE);
            }

        }else{
            holder.ImageView.setImageResource(R.drawable.ic_call_white_24dp);
            holder.toggleimageView.setImageResource(R.drawable.ic_textsms_white_24dp);
            holder.text_view.setText(rowItem.getCalltype());
        }

        holder.text_view.setTextColor(Color.BLACK);
        holder.text_view.setTypeface(null, Typeface.BOLD);

    }

    holder.check_in_user_name.setText(rowItem.getUserName());

    if(!rowItem.getTime().equalsIgnoreCase(context.getString(R.string.check))){
        holder.circle_view.setText(Utils.TimeFormat(rowItem.getTime()));
        holder.circle_view.setTextAppearance(context, android.R.style.TextAppearance_Small);
        holder.circle_view.setTextColor(Color.WHITE);

        GradientDrawable drawable = (GradientDrawable)holder.circle_view.getBackground();
        drawable.setStroke(1, Color.parseColor(pref.getString(PrefsConstants.ThemeColor, PrefsConstants.DEFAULT_THEME))); // set stroke width and stroke color
        drawable.setColor(Color.parseColor(pref.getString(PrefsConstants.ThemeColor, PrefsConstants.DEFAULT_THEME)));

    }else{

        holder.circle_view.setText(rowItem.getTime());
        holder.circle_view.setTextSize(Utils.tick_size);
        holder.circle_view.setTextColor(Color.parseColor(pref.getString(PrefsConstants.ThemeColor, PrefsConstants.DEFAULT_THEME)));

        holder.circle_view.setTypeface(Utils.getSwalok_Font(context));

        GradientDrawable drawable = (GradientDrawable)holder.circle_view.getBackground();
        drawable.setStroke(4, Color.parseColor(pref.getString(PrefsConstants.ThemeColor, PrefsConstants.DEFAULT_THEME))); // set stroke width and stroke color
        drawable.setColor(Color.WHITE);
    }


    //holder.ImageView.setColorFilter(Color.parseColor(pref.getString(PrefsConstants.ThemeColor, PrefsConstants.DEFAULT_THEME)), android.graphics.PorterDuff.Mode.MULTIPLY);
    //
    GradientDrawable drawable1 = (GradientDrawable)holder.toggleimageView.getBackground();
    drawable1.setStroke(1,Color.parseColor((pref.getString(PrefsConstants.ThemeSecondaryColor, PrefsConstants.DEFAULT_SecondaryTHEME)))); // set stroke width and stroke color
    drawable1.setColor(Color.parseColor((pref.getString(PrefsConstants.ThemeSecondaryColor, PrefsConstants.DEFAULT_SecondaryTHEME)))); // set stroke width and stroke color


    GradientDrawable drawable = (GradientDrawable)holder.ImageView.getBackground();
    drawable.setStroke(1,Color.parseColor((pref.getString(PrefsConstants.ThemeSecondaryColor, PrefsConstants.DEFAULT_SecondaryTHEME)))); // set stroke width and stroke color
    drawable.setColor(Color.parseColor((pref.getString(PrefsConstants.ThemeSecondaryColor, PrefsConstants.DEFAULT_SecondaryTHEME)))); // set stroke width and stroke color



    if(rowItem.getIsCallorSms().equalsIgnoreCase("sms")){
        holder.toggleimageView.setVisibility(View.INVISIBLE);
    }else{
        holder.toggleimageView.setVisibility(View.VISIBLE);
    }

}

@SuppressLint("SetTextI18n")
@Override
public void onBindHeaderViewHolder(SectioningAdapter.HeaderViewHolder viewHolder, int sectionIndex) {
    SectionSMS s = sections.get(sectionIndex);
    HeaderViewHolder hvh = (HeaderViewHolder) viewHolder;

    hvh.header_date.setText(Utils.StickyHeaderDateFormat(s.alpha));

   /* if(!sections.get(sectionIndex).getTime().equalsIgnoreCase(context.getString(R.string.check))){
        hvh.header_date.setText(Utils.StickyHeaderDateFormat(sections.get(sectionIndex).getTime()));
    }else{
        hvh.header_date.setText(Utils.StickyHeaderDateFormat(sections.get(sectionIndex).getOrignalTime()));
    }*/

   /* if (USE_DEBUG_APPEARANCE) {
        hvh.itemView.setBackgroundColor(0x55ffffff);
        hvh.titleTextView.setText(pad(sectionIndex * 2) + s.alpha);
    } else {
        hvh.titleTextView.setText(s.alpha);
    }*/
}

}

@Neuron64
Copy link

Neuron64 commented Jul 20, 2016

I have the same error
My Activity_Main with ViewPager:

<
android.support.v4.widget.DrawerLayout
xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
tools:context=".activity.MainActivity">

<android.support.design.widget.CoordinatorLayout
    android:id="@+id/main_content"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/My.AppCompat.ActionBar">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:theme="@style/My.AppCompat.Toolbar"
                app:popupTheme="@style/My.AppCompat.ActionBar.popupMenu"
                style="@style/MyThemeToolbar"
                app:layout_scrollFlags="scroll|enterAlways"
            />

        <com.kingofneurons.esport.observer.helper.PagerSlidingTabStrip
            android:id="@+id/tabs"
            android:layout_width="match_parent"
            android:layout_height="48dp"
            app:pstsTabSwitch="true"
            style="@style/My.AppCompat.PagerSlidingTabStrip"/>
    </android.support.design.widget.AppBarLayout>

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"/>

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fabBtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_action_refresh"
        app:layout_anchor="@id/viewpager"
        app:layout_anchorGravity="bottom|right|end"
        app:fabSize="normal"
          />
</android.support.design.widget.CoordinatorLayout>
<android.support.design.widget.NavigationView
    android:id="@+id/navigation"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    style="@style/NavigationView"
    app:menu="@menu/my_navigation_items"
    app:headerLayout="@layout/navigation_header"
    app:itemIconTint="@color/check_drawable_items"
    />

</android.support.v4.widget.DrawerLayout>

@robertmallare
Copy link

robertmallare commented Jul 23, 2016

Hi guys, I'm having this issue as well and I am pretty sure I got the code sample correct. Can someone provide a clear way to resolve this?

@ShamylZakariya
Copy link
Owner

Can you make me a simple project that reproduces the bug? It would help.

@ShamylZakariya ShamylZakariya self-assigned this Jul 25, 2016
@juangranadilla
Copy link

I'm having the same issue. When I set the adapter inside a Retrofit callback, it shows the same error. When I set the adapter with manual data in the OnCreate method of the activity or fragment, it works fine.

@achinverma
Copy link
Author

@ShamylZakariya please fix this issue

@ShamylZakariya
Copy link
Owner

@juangranadilla that was the information I needed to understand what's been going on. Thanks!

The issue is a scenario where the StickyHeaderLayoutManager is assigned to the RecyclerView, but the SectioningAdapter isn't assigned until later in the lifecycle of the recyclerview.

I've created a test which reproduces the bug, and worked out a fix. Will be posting update pronto.

ShamylZakariya added a commit that referenced this issue Jul 29, 2016
@ShamylZakariya
Copy link
Owner

OK everybody, please give a shot with release 0.7.5 - let me know if it fixes (or doesn't fix) your crashes.

@tiendatit92
Copy link

Hi guys, i am using your lib for my project, it worked very cool with header created. so i have a problem header when scrolling. It have not sticked at the top as same your demo showed. And i have found that the different your view is AppCompatActivity and mine is fragment. I have searched everywhere on google then i can not fix it. Can you review this problem. Thank you so much

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

No branches or pull requests

6 participants