Recyclerview ListAdapter不更新

时间:2019-03-02 08:36:05

标签: android android-recyclerview recycler-adapter

我在使用View Model时已在RecyclerView中实现了基本的ListAdapter。我得到的数据是通过调用API从networkManager到Viewmodel。即使我确实获得了数据,submitList也不起作用,因此没有数据膨胀。

UpcomingGroupFragment

 really.new.data <- cbind(new.data[1:154], flatten(new.data[155]))
 str(really.new.data)
 #--------
'data.frame':   4 obs. of  714 variables:
 $ ticker                : chr  "MS" "GS" "MPC" "ORCL"
 $ tradeDate             : chr  "2019-03-01" "2019-03-01" "2019-03-01" "2019-03-01"
 $ assetType             : int  3 3 3 3
 $ priorCls              : num  42 196.7 62 52.1
 $ pxAtmIv               : num  42.6 198.4 62.5 52.6
 $ mktCap                : int  73261 73803 43158 217909
 $ cVolu                 : int  24699 28845 9612 17659
 #----------- snipped-----

Adapter类扩展了ListAdapter。

用于覆盖提交列表的链接:https://stackoverflow.com/a/50062174

代码如下:

GroupAdapter_new

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()));
            }
        });
    }
}

如果要查看我的ViewModel类,则:

UpcomingViewModel

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;
        }
    };
}

最初,列表的大小为零,因此错误提示为

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(); }
    }
}

以上日志显示数据正在添加到arraylist中,但没有更新。同样在所有这些日志之后,当我返回到片段时,也会收到以下错误。

    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

要添加的另一件事是适配器的getItemCount正在正确更新。但即使在那之后,我仍然出错:

no adapter Attached, Skipping Layout

编辑:我通过注释掉用于覆盖SubmitList方法的代码来修复了该错误。我还在片段类的观察者方法中设置适配器

0 个答案:

没有答案