After first qr code scan i make API call and get data. its work fine. But later when i scan other QRcode the data is retrieved but its not shown in inner recyclerview, mean no expand and collapse function works.

after instantiating recyclerview, adapter & layout manager. i scan qrcode and with result i make api call. then observe it and send data for first binding.

Below is Observer.

  //ViewModel Observer
private void observeVIewModel() {
    qrTrac_viewModel.getQRTrackListLiveData().observe(this, qrTrackingList -> {
        if (qrTrac_viewModel.getSerResponseCodeVModel() != null) {
            if (qrTrac_viewModel.getSerResponseCodeVModel().equals(Constants.OK)){
                if (qrTrackingList != null) {
                    Util.Logd(qrTrackingList.getLstQRL0().toString());
                    progressActivity.dismiss();
                    Util.Logd("qrtrack viewmodel call");

                    mLstQRL0Adapter.setLstQRL0List((ArrayList<LstQRL0>) qrTrackingList.getLstQRL0(),(ArrayList<LstQRL1Info>) qrTrackingList.getLstQRL1Info(),
                            (ArrayList<LstQRTrackingSummary>) qrTrackingList.getLstQRTrackingSummary());
                }
            } else if(qrTrac_viewModel.getSerResponseCodeVModel().equals(Constants.INTERNAL_SERVER_ERROR)){
                progressActivity.dismiss();
                Util.Loge("in not found");
                Snackbar snackbar = Snackbar.make(view, "Internal Server Error", BaseTransientBottomBar.LENGTH_INDEFINITE).setAction(android.R.string.ok, view -> {

                });
                snackbar.show();
            }
            else  {
                progressActivity.dismiss();
                Snackbar snackbar = Snackbar.make(view, qrTrac_viewModel.getSerVModelResponseMsg(), BaseTransientBottomBar.LENGTH_INDEFINITE).setAction(android.R.string.ok, v -> {});
                snackbar.show();
            }
        }
        else {
            progressActivity.dismiss();
            Snackbar snackbar = Snackbar.make(view, "Some Unknown Error occured", BaseTransientBottomBar.LENGTH_INDEFINITE).setAction(android.R.string.ok, v -> {});
            snackbar.show();
        }
    });
}

Here is first Adapter.

 public class LstQRL0Adapter extends RecyclerView.Adapter<LstQRL0Adapter.LstQRL0ViewHolder> {

private Context context;
private List<LstQRL0> listQRL0 = new ArrayList<>();
private List<LstQRL1Info> listQRl1Info = new ArrayList<>();
private List<LstQRTrackingSummary> listQRTracSumm = new ArrayList<>();
private View view;
private LayoutInflater inflater;
private ArrayList<LstQRL1Info> templistQRl1Info = new ArrayList<>();
private int oldL0ClickPosition = -1;

//lstQRLInfo
private RecyclerView mLstQRL1InfoRecView;
private LstQRL1InfoAdapter mLstQRL1InfoAdapter;
private LinearLayoutManager mLst1Manager;

public LstQRL0Adapter(Context context) {
    inflater = LayoutInflater.from(context);
    this.context = context;
}

public void setLstQRL0List(ArrayList<LstQRL0> list, ArrayList<LstQRL1Info> listQRl1Info, ArrayList<LstQRTrackingSummary> listQRTracSumm) {
    this.listQRL0 = list;
    this.listQRl1Info = listQRl1Info;
    this.listQRTracSumm = listQRTracSumm;
    oldL0ClickPosition = -1 ;
    notifyDataSetChanged();

@NonNull
@Override
public LstQRL0Adapter.LstQRL0ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    view = inflater.inflate(R.layout.lstqrl0_baseview, parent, false);
    return new LstQRL0ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull LstQRL0Adapter.LstQRL0ViewHolder holder, int position) {
    LstQRL0 myL0List = listQRL0.get(position);

    holder.mSeason.setText(myL0List.getNvGDSeason());
    holder.mStyle.setText(myL0List.getStyleBriefDescr().replace("<br/>", "\n"));
    holder.mVendor.setText(myL0List.getNvPartnerVendor());

    mLstQRL1InfoAdapter = new LstQRL1InfoAdapter(context);
    mLstQRL1InfoRecView.setAdapter(mLstQRL1InfoAdapter);
    mLstQRL1InfoRecView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false));

    templistQRl1Info.clear();

    for (int i = 0; i < listQRl1Info.size(); i++) {
        if (listQRl1Info.get(position).getId().equals(listQRl1Info.get(i).getId()) && !listQRl1Info.get(i).getId().isEmpty()) {
            Util.Logd(listQRl1Info.get(i).getId() + " is l0 adapter");
            templistQRl1Info.add(listQRl1Info.get(i));
        }
    }

    Util.Logd(templistQRl1Info.size() +" is temp l0 size");
    mLstQRL1InfoAdapter.setLstQRL1infoList(templistQRl1Info, (ArrayList<LstQRTrackingSummary>) listQRTracSumm);

    if (listQRL0.get(position).isL0Expanded()) {
        holder.mLstQrL0ImageView.setImageResource(R.drawable.ic_arrow_drop_down);
        mLstQRL1InfoRecView.setVisibility(View.VISIBLE);
    } else {
        holder.mLstQrL0ImageView.setImageResource(R.drawable.ic_arrow_right);
        mLstQRL1InfoRecView.setVisibility(View.GONE);
    }

    view.setOnClickListener(view -> {
        if (oldL0ClickPosition >= 0){
            if (listQRL0.get(oldL0ClickPosition).isL0Expanded()) {
                listQRL0.get(oldL0ClickPosition).setL0Expanded(false);
                mLstQRL1InfoRecView.setVisibility(View.GONE);
                notifyItemChanged(oldL0ClickPosition);
            }
        }

        if (oldL0ClickPosition == holder.getAdapterPosition()){
            oldL0ClickPosition = -1 ;
        }else {
            oldL0ClickPosition = holder.getAdapterPosition() ;
        }

        Util.Logd("Old clickc is "+oldL0ClickPosition);
        if (oldL0ClickPosition >= 0){
            new Handler(Looper.myLooper()).postDelayed(() -> {
                listQRL0.get(oldL0ClickPosition).setL0Expanded(!listQRL0.get(oldL0ClickPosition).isL0Expanded());
                notifyItemChanged(oldL0ClickPosition);
            }, 500);
        }
    });
}

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

public class LstQRL0ViewHolder extends RecyclerView.ViewHolder {

    private TextView mSeason, mStyle, mVendor;
    private ImageView mLstQrL0ImageView;

    public LstQRL0ViewHolder(@NonNull View itemView) {
        super(itemView);
        Util.Logd("just check is called");
        mSeason = itemView.findViewById(R.id.lstqrl0_season);
        mStyle = itemView.findViewById(R.id.lstqrl0_style);
        mVendor = itemView.findViewById(R.id.lstqrl0_vendor);
        mLstQrL0ImageView = itemView.findViewById(R.id.lstqr10_arrow);
        mLstQRL1InfoRecView = itemView.findViewById(R.id.lstqrl1info_rv);

    }
}

}

Here is Second Adapter

  public class LstQRL1InfoAdapter extends RecyclerView.Adapter<LstQRL1InfoAdapter.LstQRL1InfoViewHolder> {

private Context context;
private List<LstQRL1Info> lstQRL1Infos = new ArrayList<>();
private List<LstQRTrackingSummary> listQRTracSumm = new ArrayList<>();
private ArrayList<LstQRTrackingSummary> tempListQRTracSumm = new ArrayList<>();
private View view;
private LayoutInflater inflater;
private int oldL1ClickPosition = 0;   // not used in this case

//LstQRTracingSummary
private RecyclerView mQRLTracSummRV;
private LstQRTracSummAdapter mQrTracSummAdapter;
private LinearLayoutManager mQrTrackSummManager;

public LstQRL1InfoAdapter(Context context) {
    this.context = context;
    inflater = LayoutInflater.from(context);
}

public void setLstQRL1infoList(ArrayList<LstQRL1Info> list, ArrayList<LstQRTrackingSummary> listQRTracSumm) {
    this.lstQRL1Infos = list;
    this.listQRTracSumm = listQRTracSumm;
    notifyDataSetChanged();
}

@NonNull
@Override
public LstQRL1InfoViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    view = inflater.inflate(R.layout.lstqrl1info_baseview, parent, false);
    return new LstQRL1InfoViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull LstQRL1InfoViewHolder holder, int position) {
    holder.bind(lstQRL1Infos.get(position),position);
}

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

public class LstQRL1InfoViewHolder extends RecyclerView.ViewHolder {

    private TextView quantity, info, add_info;
    private ImageView mlstqrl1info_arrow;

    public LstQRL1InfoViewHolder(@NonNull View itemView) {
        super(itemView);
        quantity = itemView.findViewById(R.id.lstqr1info_quantity);
        info = itemView.findViewById(R.id.lstqr1info_info);
        add_info = itemView.findViewById(R.id.lstqrl1info_add_info);
        mQRLTracSummRV = itemView.findViewById(R.id.lstqrtracsumm_rv);
        mlstqrl1info_arrow = itemView.findViewById(R.id.lstqr1info_arrow);

            itemView.setOnClickListener(view -> {
            if (lstQRL1Infos.get(oldL1ClickPosition).isL1Expanded()) {
                Util.Logd("in expanded check");
                lstQRL1Infos.get(oldL1ClickPosition).setL1Expanded(false);
                mQRLTracSummRV.setVisibility(View.GONE);
                notifyItemChanged(oldL1ClickPosition);
            }

            oldL1ClickPosition = getAdapterPosition() ;

            new Handler(Looper.myLooper()).postDelayed(() -> {
            }, 500);
            lstQRL1Infos.get(getAdapterPosition()).setL1Expanded(!lstQRL1Infos.get(getAdapterPosition()).isL1Expanded());
            notifyItemChanged(getAdapterPosition());
        });
    }

    public void bind(LstQRL1Info lstQRL1Info,int position) {
        quantity.setText(Math.round(lstQRL1Info.getmQty())+"");
        info.setText(lstQRL1Info.getNvGDActivity());
        add_info.setText(lstQRL1Info.getNvAdditionalInfo1());

        mQrTracSummAdapter = new LstQRTracSummAdapter(context);
        mQRLTracSummRV.setAdapter(mQrTracSummAdapter);
        mQRLTracSummRV.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false));

        tempListQRTracSumm.clear() ;

        for (int i = 0; i < listQRTracSumm.size(); i++) {
            if (lstQRL1Info.getId().equals(listQRTracSumm.get(i).getIdQRTrackingList()) && !listQRTracSumm.get(i).getIdQRTrackingList().isEmpty()) {
                tempListQRTracSumm.add(listQRTracSumm.get(i));
                Util.Logd(listQRTracSumm.get(i).getIdQRTrackingList() + " is info adapter");
            }
        }
        Util.Logd("in view binding and size is " + lstQRL1Infos.size() + "   "+ tempListQRTracSumm.size());
        mQrTracSummAdapter.setListQRTracSumm(tempListQRTracSumm);

        if (lstQRL1Infos.get(position).isL1Expanded()) {
            mlstqrl1info_arrow.setImageResource(R.drawable.ic_arrow_drop_down);
            mQRLTracSummRV.setVisibility(View.VISIBLE);
        } else {
            mlstqrl1info_arrow.setImageResource(R.drawable.ic_arrow_right);
            mQRLTracSummRV.setVisibility(View.GONE);
        }
    }
}

}

Third adapter is also same as like second one. First Adapter is bit different from second and third as am working on it to achieve what is needed.

Probelem : When i scan second and subsequent times then data from api call is received and i think properly set as well but somewhow its not show recyclerview 2 data.(First recyclerview data is shown properly).

Help me whether its different approach or update in same code.

Thanks in Advance.

1

There are 1 answers

0
Ashok Jangra On

UPDATE - Above code is correct , the mistake I was doing is -> I was creating RecyclerView adapter instance in advance when Activity runs for 1st time (Which is advance initialization of adapter) and was updating data later when QrCode is scanned and Api call is made .

So now I was creating instance when data is received by observer . as Shown Below

    private void observeVIewModel() {

    qrTrac_viewModel.getQRTrackListLiveData().observe(this, qrTrackingList -> {
        if (qrTrac_viewModel.getSerResponseCodeVModel() != null) {
            if (qrTrac_viewModel.getSerResponseCodeVModel().equals(Constants.OK)){
                if (qrTrackingList != null) {
                    Util.Logd(qrTrackingList.getLstQRL0().toString());
                    progressActivity.dismiss();
                    Util.Logd("qrtrack viewmodel call");

                    // result sent to adapters for binding
                    mLstQRL0Adapter = new LstQRL0Adapter(this,(ArrayList<LstQRL0>) qrTrackingList.getLstQRL0(),(ArrayList<LstQRL1Info>) qrTrackingList.getLstQRL1Info(),
                            (ArrayList<LstQRTrackingSummary>) qrTrackingList.getLstQRTrackingSummary());
                    mLst0Manager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
                    mLst0RecView.setLayoutManager(mLst0Manager);
                    mLst0RecView.setNestedScrollingEnabled(false);
                    mLst0RecView.setRecycledViewPool(sharedPool);
                    mLst0RecView.setAdapter(mLstQRL0Adapter);
                    mLstQRL0Adapter.notifyDataSetChanged();
                }
            } else if(qrTrac_viewModel.getSerResponseCodeVModel().equals(Constants.INTERNAL_SERVER_ERROR)){
                progressActivity.dismiss();
                Util.Loge("in not found");
                Snackbar snackbar = Snackbar.make(view, "Internal Server Error", BaseTransientBottomBar.LENGTH_INDEFINITE).setAction(android.R.string.ok, view -> {

                });
                snackbar.show();
            }
            else  {
                progressActivity.dismiss();
                Snackbar snackbar = Snackbar.make(view, qrTrac_viewModel.getSerVModelResponseMsg(), BaseTransientBottomBar.LENGTH_INDEFINITE).setAction(android.R.string.ok, v -> {});
                snackbar.show();
            }
        }
        else {
            progressActivity.dismiss();
            Snackbar snackbar = Snackbar.make(view, "Some Unknown Error occured", BaseTransientBottomBar.LENGTH_INDEFINITE).setAction(android.R.string.ok, v -> {});
            snackbar.show();
        }
    });
}

Same way I was doing for further adapters for nested lists to work better .

1st dapter.

public class LstQRL0Adapter extends RecyclerView.Adapter<LstQRL0Adapter.LstQRL0ViewHolder> {

private Context context;
private List<LstQRL0>  listQRL0 = new ArrayList<>() ;
private List<LstQRL1Info>  listQRl1Info = new ArrayList<>(); ;
private List<LstQRTrackingSummary> listQRTracSumm = new ArrayList<>();
private View view;
private LayoutInflater inflater;
private ArrayList<LstQRL1Info> templistQRl1Info = new ArrayList<>();
private int oldL0ClickPosition = -1;
private Boolean isFromClose = false ;

//lstQRLInfo
private RecyclerView mLstQRL1InfoRecView;
public LstQRL1InfoAdapter mLstQRL1InfoAdapter;

public LstQRL0Adapter(Context context,ArrayList<LstQRL0> list, ArrayList<LstQRL1Info> listQRl1Info, ArrayList<LstQRTrackingSummary> listQRTracSumm) {
    inflater = LayoutInflater.from(context);
    this.context = context;
    this.listQRL0 = list;
    this.listQRl1Info = listQRl1Info;
    this.listQRTracSumm = listQRTracSumm;
    oldL0ClickPosition = -1;
}


@NonNull
@Override
public LstQRL0Adapter.LstQRL0ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    view = inflater.inflate(R.layout.lstqrl0_baseview, parent, false);
    return new LstQRL0ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull LstQRL0Adapter.LstQRL0ViewHolder holder, int position) {
    LstQRL0 myL0List = listQRL0.get(position);

    holder.mSeason.setText(myL0List.getNvGDSeason());
    holder.mStyle.setText(myL0List.getStyleBriefDescr().replace("<br/>", "\n"));
    holder.mVendor.setText(myL0List.getNvPartnerVendor());



    Util.Logd( "temp l0 size is "+templistQRl1Info.size());
    if (!isFromClose){
        templistQRl1Info.clear();

        if (oldL0ClickPosition >=0){
            for (int i = 0; i < listQRl1Info.size(); i++) {
                if (listQRL0.get(oldL0ClickPosition).getId().equals(listQRl1Info.get(i).getId())) {
                    Util.Logd( "temp ids are "+listQRl1Info.get(i).getId());
                    templistQRl1Info.add(listQRl1Info.get(i));
                }
            }
        }
        mLstQRL1InfoAdapter = new LstQRL1InfoAdapter(context,templistQRl1Info, (ArrayList<LstQRTrackingSummary>) listQRTracSumm);
        mLstQRL1InfoRecView.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false));
        mLstQRL1InfoRecView.setNestedScrollingEnabled(false);
        mLstQRL1InfoRecView.setAdapter(mLstQRL1InfoAdapter);
        mLstQRL1InfoAdapter.notifyDataSetChanged();
    }

    boolean isL0Expanded = myL0List.isL0Expanded();
    Util.Logd("Expanded status is "+ position + " " + listQRL0.get(position).isL0Expanded());
    if (isL0Expanded) {
        holder.mLstQrL0ImageView.setImageResource(R.drawable.ic_arrow_drop_down);
        holder.hideShowL0Layout.setVisibility(View.VISIBLE);
    } else {
        holder.mLstQrL0ImageView.setImageResource(R.drawable.ic_arrow_right);
        holder.hideShowL0Layout.setVisibility(View.GONE);
    }

    holder.itemView.setOnClickListener(view -> {

        Util.Logd("////////////////////////");
        if (oldL0ClickPosition >= 0) {
            if (listQRL0.get(oldL0ClickPosition).isL0Expanded()) {
                listQRL0.get(oldL0ClickPosition).setL0Expanded(false);
                holder.hideShowL0Layout.setVisibility(View.GONE);
                Util.Logd("Id to close is "+listQRL0.get(oldL0ClickPosition).getId());
                isFromClose = true ;
                notifyItemChanged(oldL0ClickPosition);
            }
        }

        if (oldL0ClickPosition == holder.getAdapterPosition()) {
            oldL0ClickPosition = -1;
        } else {
            oldL0ClickPosition = holder.getAdapterPosition();
        }

        Util.Logd("New click is " + oldL0ClickPosition);
        if (oldL0ClickPosition >= 0 && oldL0ClickPosition != -1) {
            new Handler(Looper.myLooper()).postDelayed(() -> {
                listQRL0.get(oldL0ClickPosition).setL0Expanded(!listQRL0.get(oldL0ClickPosition).isL0Expanded());
                Util.Logd("new data modify is "+listQRL0.get(oldL0ClickPosition).getId());
                isFromClose = false ;
                notifyItemChanged(oldL0ClickPosition);
            },500);
        }
    });
}

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

public class LstQRL0ViewHolder extends RecyclerView.ViewHolder {

    private TextView mSeason, mStyle, mVendor;
    private ImageView mLstQrL0ImageView;
    private LinearLayout hideShowL0Layout;

    public LstQRL0ViewHolder(@NonNull View itemView) {
        super(itemView);
        mSeason = itemView.findViewById(R.id.lstqrl0_season);
        mStyle = itemView.findViewById(R.id.lstqrl0_style);
        mVendor = itemView.findViewById(R.id.lstqrl0_vendor);
        mLstQrL0ImageView = itemView.findViewById(R.id.lstqr10_arrow);
        mLstQRL1InfoRecView = itemView.findViewById(R.id.lstqrl1info_rv);
        hideShowL0Layout = itemView.findViewById(R.id.hideShowL0Layout);
    }
}

}

There is one more nested adapter but thats also same , so am not posting that here.

If need any help then just post comment.