2

I have implemented a basic ListAdapter in RecyclerView as I am using View Model. The data I am getting is from networkManager to Viewmodel by calling API. Even when I did got the data the submitList is not Working and thus no data is getting inflated.

UpcomingGroupFragment

public class UpcomingGroupFragment extends Fragment {

    private UpcomingViewModel mViewModel;
    private RecyclerView recyclerView;
    private GroupAdapter_new adapter;

    public static UpcomingGroupFragment newInstance() {
        return new UpcomingGroupFragment();
    }

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_chatgroups, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        recyclerView = view.findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);

        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(layoutManager);

        adapter = new GroupAdapter_new();

        recyclerView.setAdapter(adapter);
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        mViewModel = ViewModelProviders.of(this).get(UpcomingViewModel.class);

        mViewModel.getMutableLiveData().observe(this, new Observer<List<ChatGroups_New>>() {
            @Override
            public void onChanged(@Nullable List<ChatGroups_New> chatGroups_news) {
                adapter.submitList(chatGroups_news);
                Log.e("Upcoming", String.valueOf(chatGroups_news.size()));
            }
        });
    }
}

The Adapter Class extends the ListAdapter.

Link for overriding submitlist: https://stackoverflow.com/a/50062174

The Code is as follows:

GroupAdapter_new

public class GroupAdapter_new extends ListAdapter<ChatGroups_New,GroupAdapter_new.ViewHolder> {


    public GroupAdapter_new() {
        super(DIFF_CALLBACK);
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        Context context = parent.getContext();
        int layoutID = R.layout.ongoing_group;
        LayoutInflater inflater = LayoutInflater.from(context);
        View view = inflater.inflate(layoutID,parent,false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        ChatGroups_New currentGroup = getItem(position);
        holder.text_flightarrival.setText(currentGroup.getFlightNameArrival());
    }

    class ViewHolder extends RecyclerView.ViewHolder {

        public ViewHolder(View itemView) {
            super(itemView);
            //... Finding ID's for various Views
        }
    }


    /****ADDED THIS FROM CODE*****/
    @Override
    public void submitList(List<ChatGroups_New> list) {
        super.submitList(list != null ? new ArrayList<ChatGroups_New>() : null);
    }

    /***********/
    private static final DiffUtil.ItemCallback<ChatGroups_New> DIFF_CALLBACK =
            new DiffUtil.ItemCallback<ChatGroups_New>() {
        @Override
        public boolean areItemsTheSame(ChatGroups_New oldItem, ChatGroups_New newItem) {
            Log.e("areItemsTheSame", String.valueOf(oldItem.getMergedLogId() == newItem.getMergedLogId()));
            return oldItem.getMergedLogId() == newItem.getMergedLogId();
        }
        @Override
        public boolean areContentsTheSame(ChatGroups_New oldItem, ChatGroups_New newItem) {
            if(oldItem.getFlightIcon().equals(newItem.getFlightIcon()) && oldItem.getFlightNameArrival().equals(newItem.getFlightNameArrival())){
                if(oldItem.getGateValue().equals(newItem.getGateValue()) && oldItem.getEtaValue().equals(newItem.getEtaValue())){
                    if(oldItem.getAlertValue().equals(newItem.getAlertValue()) && oldItem.getTaskcompletedValue().equals(newItem.getTaskcompletedValue())){
                        Log.e("areContentsTheSame", "true");
                        return true;
                    }
                }
            }
            return false;
        }
    };
}

If you want to see my ViewModel Class then:

UpcomingViewModel

public class UpcomingViewModel extends AndroidViewModel
        implements I_NetworkResponse {

    private NetworkManager networkManager;
    private SharedPrefService prefService;
    private HashMap<String, String> header;
    private final String TAG = "UpcomingViewModel";
    private List<ChatGroups_New> upcomingList;

    private MutableLiveData<List<ChatGroups_New>> mutableLiveData;

    public UpcomingViewModel(@NonNull Application application) {
        super(application);

        prefService = SharedPrefService.getInstance(application);
        networkManager = new NetworkManager(application,this);
        upcomingList = new ArrayList<>();
        mutableLiveData = new MutableLiveData<>();
        mutableLiveData.setValue(upcomingList);
        header = new HashMap<>();
        header.put("authorizationcode",prefService.getStringValue(Keys.getPreferenceAuthKey()));

        if(upcomingList.isEmpty()){
            networkManager.Volley_JsonObjectRequest(Keys.getBaseUrl()+"AviLeap/flights/upcoming",
                    header,null,TAG,"AviLeap/flights/upcoming");
        }
    }


    public MutableLiveData<List<ChatGroups_New>> getMutableLiveData() { return mutableLiveData; }

    @Override
    public void getNetworkSuccessResponse(String TAG, String successResponse, String TAGforApi) {
        Log.e(TAGforApi,successResponse);

        parseUpcomingFlight(successResponse, upcomingList);
        mutableLiveData.setValue(upcomingList);
    }

    @Override
    public void getNetworkFailResponse(String TAG, VolleyError failResponse, String TAGforApi) { }

    @Override
    protected void onCleared() {
        super.onCleared();
        networkManager.stopNetworkCallsWithTag(TAG);
    }


    private void parseUpcomingFlight(String successResponse, List<ChatGroups_New> upcomingList) {
        try {
            JSONObject rootObject = new JSONObject(successResponse);
            if(rootObject.has("upcomingflights") && rootObject.opt("upcomingflights") instanceof JSONArray){
                JSONArray flightsArray = rootObject.optJSONArray("upcomingflights");
                for(int flightIndex = 0; flightIndex <  flightsArray.length(); flightIndex++){
                    JSONObject flightObject = flightsArray.optJSONObject(flightIndex);

                    int mergedLogId = flightObject.optInt("logid");
                    upcomingList.add(new ChatGroups_New(mergedLogId));
                    Log.e("parseUpcomingFlight", String.valueOf(upcomingList.size()));//..... Log Point
                }
            }
        }
        catch (JSONException e) { e.printStackTrace(); }
    }
}

Initially the Size of the List is zero, so the Error is coming for as

    AviLeap/flights/upcoming: //.... API CALL
2019-03-02 13:25:53.652 8477-8477/com.avileapconnect.com E/parseUpcomingFlight: 1 2019-03-02 13:25:53.652 8477-8477/com.avileapconnect.com E/parseUpcomingFlight: 2 
2019-03-02 13:25:53.653 8477-8477/com.avileapconnect.com E/Upcoming: 2

The above logs show that the data is being added to the arraylist, but it is not updating. Also after all these logs when I go back to my Fragment I get the following error.

no adapter Attached, Skipping Layout

One more thing to add is that the adapter's getItemCount is getting updated properly. But even after that I am getting error:

no adapter Attached, Skipping Layout

EDIT: I fixed the error by commenting out the code for overriding the SubmitList method. I am also setting the adapter in the observer method in the fragment Class

Nishant Garg
  • 135
  • 9

0 Answers0