4

I Want to Implement notifyDataSetChanged or auto refresh to my RecyclerView but its not working , i have tried so many methods to work this out but unfortunately all methods end up with crashes , some didn't work. I'm new to development so, plz help me to figure this out. and also want to know, this is the right way to create the reference of the DataAapter ?

DataAdapter dataadaper; (full code given below)

if not then how?

With this code(given Below ) My Application crashes when open , want to know what im doing wrong so i can learn from my mistakes. :) thanks

public class DataAdapter extends RecyclerView.Adapter<DataAdapter.ViewHolder> {
public static String Camp_ID[] = new String[15];
private ArrayList<AndroidVariables> android;
private Context context;
AnimatorSet set;
DataAdapter dataAdapter

String url = "_URL";



public DataAdapter(ArrayList<AndroidVariables> android) {
    this.context = context;
    this.android = android;
    if (OffersFragment.srl.isRefreshing()) {
        OffersFragment.srl.setRefreshing(false);
    }
}


@Override
public DataAdapter.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    if (android.get(i).getCamp_ID().equals("1")) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_list_offer_big, viewGroup, false);

        return new ViewHolder(view);
    }
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_list, viewGroup, false);
    return new ViewHolder(view);
}

@Override
public int getItemViewType(int i) {
    return i;
}


public void myNotifyDataSetChanged()
{
    this.notifyDataSetChanged();

}

@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {

    Context context = viewHolder.p_img.getContext();
    viewHolder.p_name.setText(android.get(i).getName());
    viewHolder.p_quant.setText(android.get(i).getVer());
    viewHolder.p_cat.setText(android.get(i).getApi());
    viewHolder.p_earn.setText("₹" + android.get(i).getCash());
    Camp_ID[i] = android.get(i).getCamp_ID();
    Picasso.with(context).load(url + android.get(i).getImage()).into(viewHolder.p_img);


    dataAdapter.myNotifyDataSetChanged();
}

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

}

public class ViewHolder extends RecyclerView.ViewHolder {
    private TextView p_name, p_quant, p_cat, p_earn;
    private ImageView p_img, plus;

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

        p_name = (TextView) view.findViewById(R.id.list_product);
        p_quant = (TextView) view.findViewById(R.id.list_quantity);
        p_cat = (TextView) view.findViewById(R.id.list_category);
        p_earn = (TextView) view.findViewById(R.id.earning);
        p_img = (ImageView) view.findViewById(R.id.list_productimg);
        plus = (ImageView) view.findViewById(R.id.plusoffers);

        plus.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                plus.setImageResource(R.drawable.check_small);
            //DO_ANY_THING
            }
        });
    }
}
}

LOG

04-02 02:17:11.820 24357-24357/? E/AndroidRuntime: FATAL EXCEPTION: main
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime: Process:   earn.free.cashback, PID: 24357
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:   java.lang.NullPointerException: Attempt to invoke virtual method 'void     earn.free.cashback.DataAdapter.myNotifyDataSetChanged()' on a null   object reference
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at earn.free.cashback.DataAdapter.onBindViewHolder(DataAdapter.java:94)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at  earn.free.cashback.DataAdapter.onBindViewHolder(DataAdapter.java:30)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at  android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.jav     a:5453)
 04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at  android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:     5486)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at   android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.    java:4723)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at   android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.    java:4599)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManag    er.java:1988)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.ja    va:1384)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1347    )
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManag    er.java:574)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at  android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:300    3)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:2881)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.support.v7.widget.RecyclerView.onLayout(RecyclerView.java:3265)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.view.View.layout(View.java:15671)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.view.ViewGroup.layout(ViewGroup.java:5038)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.support.v4.widget.SwipeRefreshLayout.onLayout(SwipeRefreshLayout.java:59    6)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at     android.view.View.layout(View.java:15671)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.view.ViewGroup.layout(ViewGroup.java:5038)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.view.View.layout(View.java:15671)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.view.ViewGroup.layout(ViewGroup.java:5038)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.view.View.layout(View.java:15671)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.view.ViewGroup.layout(ViewGroup.java:5038)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
 04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.view.View.layout(View.java:15671)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.view.ViewGroup.layout(ViewGroup.java:5038)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.support.design.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.ja    va:1087)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at  android.support.design.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.    java:797)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at  android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:    811)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at   android.view.View.layout(View.java:15671)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.view.ViewGroup.layout(ViewGroup.java:5038)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.support.v4.view.ViewPager.onLayout(ViewPager.java:1695)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.view.View.layout(View.java:15671)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.view.ViewGroup.layout(ViewGroup.java:5038)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.support.design.widget.HeaderScrollingViewBehavior.layoutChild(HeaderScro    llingViewBehavior.java:122)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at  android.support.design.widget.ViewOffsetBehavior.onLayoutChild(ViewOffsetBehavio    r.java:42)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at    android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onLayoutChild(A    ppBarLayout.java:1149)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at   android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:    810)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at     android.view.View.layout(View.java:15671)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.view.ViewGroup.layout(ViewGroup.java:5038)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at   android.support.v4.widget.DrawerLayout.onLayout(DrawerLayout.java:1187)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.view.View.layout(View.java:15671)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.view.ViewGroup.layout(ViewGroup.java:5038)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.view.View.layout(View.java:15671)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.view.ViewGroup.layout(ViewGroup.java:5038)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:     at android.widget.LinearLayout.onLayout(LinearLayout.java:1466)
04-02 02:17:11.820 24357-24357/? E/AndroidRuntime:  at android.view.View.l
Sandeep Singh
  • 259
  • 2
  • 11

2 Answers2

1

Shadab's info is correct, though concerning initialization, I recommend removing the dataAdapter variable from your DataAdapter class and adding it to the activity that you intend to have access it; initializing it in onCreate().

public void onCreate(Bundle savedInstanceState) {
    //Initialize data set
    myAndroidData = new ArrayList<>();
    //Initialize data adapter and assign it to a recycler view
    myDataAdapter = new DataAdapter(myAndroidData);
    myRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    myRecyclerView.setAdapter(myDataAdapter);
    super.onCreate(savedInstanceState);
}

After adding or removing items from myAndroidData, call myDataAdapter.notifyDataSetChanged(); to refresh your display. Since notifyDataSetChanged() is a public function in the parent RecyclerView class, your myNotifyDataSetChanged() function is not necessary and can be removed. Avoid calling myAndroidData = new ArrayList<AndroidVariables>() after creating the adapter since dataAdapter.android would still refer to the list you initialized it with and notifyDataSetChanged() would no longer work as you'd like it to.

It is also recommended that you do not call notifyDataSetChanged() from onBindViewHolder(). onBindViewHolder should only be used for setting content displayed in the view holders and not the RecyclerView itself.

Update your onBindViewHolder() function to

@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {

    Context context = viewHolder.p_img.getContext();
    viewHolder.p_name.setText(android.get(i).getName());
    viewHolder.p_quant.setText(android.get(i).getVer());
    viewHolder.p_cat.setText(android.get(i).getApi());
    viewHolder.p_earn.setText("₹" + android.get(i).getCash());
    Camp_ID[i] = android.get(i).getCamp_ID();
    Picasso.with(context).load(url + android.get(i).getImage()).into(viewHolder.p_img);

}
0

You are trying to call myNotifyDataSetChanged() on null adapter instance. You can directly call notifyDataSetChanged() instead of calling dataAdapter.myNotifyDataSetChanged();

Shadab Ansari
  • 7,022
  • 2
  • 27
  • 45