xv.ch
xv.ch

Reputation: 33

notifyDataSetChanged() blanks out recyclerview

I have an issue where notifyDataSetChanged() in a response call will blank out the recyclerview but if the Adapter is initiated manually with a onClick, the recyclerview works. I have tested that the List has the items inside before calling notifyDataSetChanged() so i'm not sure what's wrong here.

[Main Activity] This works but i have to manually click the bnQuery.

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        apiInterface = API_client.getClient().create(APIInterface.class);

        etCoin = (EditText) findViewById(R.id.etCoin);
        bnQuery = (Button) findViewById(R.id.bnQuery);

        rcvMain = findViewById(R.id.rcvMain);


        getCoinData("2");
        //initRCV_Main();


        bnQuery.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //getCoinData("2");
                initRCV_Main();

            }
        });
    }

    private void initRCV_Main() {

        rcvMainAdp = new rcvMainAdapter(cList);
        rcvMain.setAdapter(rcvMainAdp);
        rcvMain.setLayoutManager(new LinearLayoutManager(this));

    }

    private void getCoinData(String coinLimit){

        Call<cInfoPack> call = apiInterface.doGetCoinData(coinLimit);
        call.enqueue(new Callback<cInfoPack>() {
            @Override
            public void onResponse(Call<cInfoPack> call, Response<cInfoPack> response) {

                cInfoPack list = response.body();
                List<cData> listSorter = new ArrayList<>();
                listSorter.addAll(list.getData());
                Collections.sort(listSorter, new SortbyVolChg());

                cList.clear();
                cList = listSorter;

                System.out.println("list " + list.getData().get(0).getQuote());
                System.out.println("listSorter " + listSorter.get(0).getQuote());
                System.out.println("cList " + cList.get(0).getQuote());

                //rcvMainAdp.notifyDataSetChanged();

            }

            @Override
            public void onFailure(Call<cInfoPack> call, Throwable t) {
                Toast.makeText(MainActivity.this, "onFailure", Toast.LENGTH_SHORT).show();
                Log.d("XXXX", t.getLocalizedMessage());
                call.cancel();
            }
        });

    }

[Main Activity] If i initiate the recyclerview during onCreate and use the notifyDataSetChanged() during getCoinData, I get a blank recycleview. system.out shows that the lists all contain information in them.

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        apiInterface = API_client.getClient().create(APIInterface.class);

        etCoin = (EditText) findViewById(R.id.etCoin);
        bnQuery = (Button) findViewById(R.id.bnQuery);

        rcvMain = findViewById(R.id.rcvMain);


        getCoinData("2");
        initRCV_Main();


        bnQuery.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //getCoinData("2");
                //initRCV_Main();

            }
        });
    }

    private void initRCV_Main() {

        rcvMainAdp = new rcvMainAdapter(cList);
        rcvMain.setAdapter(rcvMainAdp);
        rcvMain.setLayoutManager(new LinearLayoutManager(this));

    }

    private void getCoinData(String coinLimit){

        Call<cInfoPack> call = apiInterface.doGetCoinData(coinLimit);
        call.enqueue(new Callback<cInfoPack>() {
            @Override
            public void onResponse(Call<cInfoPack> call, Response<cInfoPack> response) {

                cInfoPack list = response.body();
                List<cData> listSorter = new ArrayList<>();
                listSorter.addAll(list.getData());
                Collections.sort(listSorter, new SortbyVolChg());

                cList.clear();
                cList = listSorter;

                System.out.println("list " + list.getData().get(0).getQuote());
                System.out.println("listSorter " + listSorter.get(0).getQuote());
                System.out.println("cList " + cList.get(0).getQuote());

                rcvMainAdp.notifyDataSetChanged();

            }

            @Override
            public void onFailure(Call<cInfoPack> call, Throwable t) {
                Toast.makeText(MainActivity.this, "onFailure", Toast.LENGTH_SHORT).show();
                Log.d("XXXX", t.getLocalizedMessage());
                call.cancel();
            }
        });

    }

[Adapter]

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

    private List<cData> idxCoin;

    //ItemClickListener itemClickListener;

    rcvMainAdapter(List<cData> data) {this.idxCoin = data;}
    @NonNull
    @NotNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull @NotNull ViewGroup parent, int viewType) {

        Context context = parent.getContext();
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(R.layout.rcv_main,parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull @NotNull ViewHolder holder, int position) {

        cData cdata = idxCoin.get(position);

        TextView tvSym = holder.tvSymbol;
        tvSym.setText(cdata.getSymbol());

        TextView tvQuo = holder.tvQuote;
        BigDecimal tvQuote_BD = new BigDecimal(cdata.getQuote().getuSD().getPrice().toString());
        tvQuote_BD.setScale(6, RoundingMode.DOWN);
        tvQuo.setText(tvQuote_BD.toString());

        TextView tvV24 = holder.tvVolume24;
        BigDecimal tvVolume24_BD = new BigDecimal(cdata.getQuote().getuSD().getVolume24h().toString());
        BigInteger tvVolume24_BI = tvVolume24_BD.toBigInteger();
        tvV24.setText(tvVolume24_BI.toString());

    }

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


    public class ViewHolder extends RecyclerView.ViewHolder {

        TextView tvSymbol, tvQuote, tvVolume24;

        public ViewHolder(@NonNull @NotNull View itemView) {
            super(itemView);

            tvSymbol = itemView.findViewById(R.id.tvSymbol);
            tvQuote = itemView.findViewById(R.id.tvQuote);
            tvVolume24 = itemView.findViewById(R.id.tvVolume24);

            //itemView.setOnClickListener(this);

        }

    }

    /*
    public interface ItemClickListener{
        void onItemClick(View view, int position);

    }

     */

}

PS: apologies for the rubbish coding as this is self taught and modifying some codes found online.

Upvotes: 1

Views: 604

Answers (2)

Rohaitas Tanoli
Rohaitas Tanoli

Reputation: 797

Remove this in response.

   cList.clear();

Add This line in response

rcvMainAdp.setdata(listSorter);

In rcvMainAdp Adapter, Create a Method setdata()

    public void setdata(ArrayList<cData> data) {
   
       this.idxCoin = data;
       
       notifyDataSetChanged();
    }

Upvotes: 1

Julius Saikauskas
Julius Saikauskas

Reputation: 69

Problem most likely is that when you call initRCV_Main() You set the adapter to the list as in rcvMainAdp = new rcvMainAdapter(cList); And when list is changed and you set it to adapter it functions.

But when you call getCoinData() and rcvMainAdp.notifyDataSetChanged(); at the end you never set the changed list to the adapter until you click initRCV_Main() again.

So maybe the fix is calling rcvMainAdp = new rcvMainAdapter(cList) and then rcvMainAdp.notifyDataSetChanged();

Upvotes: 1

Related Questions