簡體   English   中英

作為Interface中的參數的Arraylist在Android RecyclerViewAdapter中出現NullPointer Exception

[英]Arraylist as argument in Interface occur NullPointer Exception in Android RecyclerViewAdapter

我嘗試通過從RecyclerViewAdapter到fragment的接口傳遞String和ArrayList作為參數值,完美地在回收器中加載數據,但是當我嘗試選擇列表中的特定項時,它會導致NullPointerException。 這是我的代碼,已實現,請幫助解決我的問題,我一整天都遇到這個問題。

接口

 public interface QikMsgTemplateListener { void onTemplateSelectedDesc(String templateId, String templateName, String templateDesc, String templateScript, ArrayList<HashMap<String, String>> preClipList, ArrayList<HashMap<String, String>> postClipList); } 

RecyclerViewAdapter類

 public class QikRecTemplateAdapter extends RecyclerView.Adapter{ private QikMsgTemplateListener mQikMsgTemplateListener; //Constructor public QikRecTemplateAdapter(Activity activity,QikMsgTemplateListener listener, List<TemplateModel> templateList, String mSelectedTemplateName) { this.mTemplateList = templateList; this.mActivity = activity; this.mQikMsgTemplateListener = listener; this.selectedTempName = mSelectedTemplateName; } @Override public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, @NonNull int position) { //OnClickListener mHolder.mButtonTempSelect.setOnClickListener(v -> { TemplateModel mTemplateModel = mTemplateList.get(mPosition); String templateId = mTemplateModel.getTemplateId()!=null?mTemplateModel.getTemplateId():""; String templatename = mTemplateModel.getTemplateName()!=null? mTemplateModel.getTemplateName():""; String templateDesc = mTemplateModel.getTemplateDesc()!=null?mTemplateModel.getTemplateDesc():""; String templateScript = mTemplateModel.getTemplateScript()!=null?mTemplateModel.getTemplateScript():""; ArrayList<HashMap<String, String>> mSelectedPreClipList=new ArrayList<HashMap<String, String>>(); if(mTemplateModel.getPreClipList()!=null){ mSelectedPreClipList.clear(); mSelectedPreClipList = mTemplateModel.getPreClipList(); } ArrayList<HashMap<String, String>> mSelectedPostClipList=new ArrayList<HashMap<String, String>>(); if(mTemplateModel.getPostClipList()!=null){ mSelectedPostClipList.clear(); mSelectedPostClipList = mTemplateModel.getPostClipList(); } /*CallBack values pass to QikRecTemplateAdapter*/ //here facing null pointer if (mTemplateModel.getPreClipList() != null && mTemplateModel.getPostClipList() != null) { mQikMsgTemplateListener.onTemplateSelectedDesc(templateId, templatename, templateDesc, templateScript, mSelectedPreClipList, mSelectedPostClipList); } else if (mTemplateModel.getPreClipList() != null && mTemplateModel.getPostClipList() == null) { mQikMsgTemplateListener.onTemplateSelectedDesc(templateId, templatename, templateDesc, templateScript, mSelectedPreClipList, null); } else if (mTemplateModel.getPostClipList() == null && mTemplateModel.getPostClipList() != null) { mQikMsgTemplateListener.onTemplateSelectedDesc(templateId, templatename, templateDesc, templateScript, null, mSelectedPostClipList); } else if (mTemplateModel.getPostClipList() == null && mTemplateModel.getPostClipList() == null) { mQikMsgTemplateListener.onTemplateSelectedDesc(templateId, templatename, templateDesc, templateScript, null, null); } }); } } 

片段類

 public class TemplatesFragment extends Fragment implements View.OnClickListener, QikMsgTemplateListener { ArrayList<HashMap<String, String>> mPreClipList = new ArrayList<>(); ArrayList<HashMap<String, String>> mPostClipList = new ArrayList<>(); List<TemplateModel> templateList=new ArrayList<>(); @Nullable QikRecTemplateAdapter mQikRecTemplateAdapter=null; //All other initalitzing steps /*==========Invoke Lifecycle Methods==========*/ @Override public void onAttach(Context context) { super.onAttach(context); if(context instanceof QikMsgTemplateListener){ mQikMsgTemplateListener=(QikMsgTemplateListener) context; }else{ throw new RuntimeException(context.toString() + " must implement QikMsgTemplateListener"); } } @Override public void onDetach() { super.onDetach(); try { if (mQikMsgTemplateListener != null) { mQikMsgTemplateListener = null; } }catch (Exception ex){ex.printStackTrace();} } @Override public void onResume() { super.onResume(); getAPIValues(); } @Override public void onClick(@NonNull View v) { switch (v.getId()) { /*==========Action To Pass Values to Activity==========*/ case R.id.txtVw_done_template: /*CallBack values pass to Activity*/ Objects.requireNonNull(mQikMsgTemplateListener).onTemplateSelectedDesc(this.selectedTemplateId, this.temp_name,this.selectedTemplateDesc,this.selectedTemplateScript,this.mPreClipList,this.mPostClipList); Fragment mPresentDoneFragment=this; try { Objects.requireNonNull(getActivity()).getSupportFragmentManager().beginTransaction().remove(mPresentDoneFragment).commit(); }catch (Exception ex){ex.printStackTrace();}finally { mPresentDoneFragment=null; } break; default: break; } } @Override public void onTemplateSelectedDesc(String templateId, String templateName, String templateDesc, String templateScript, ArrayList<HashMap<String, String>> argPreClipList, ArrayList<HashMap<String, String>> argPostClipList) { try { if (!templateId.isEmpty()) { this.temp_name = templateName; this.selectedTemplateId = templateId; this.selectedTemplateDesc = templateDesc; this.selectedTemplateScript = templateScript; /*Here Values comes Empty or 0 when i put try catch in AdapterClass*/ if(argPreClipList!=null){ this.mPreClipList = argPreClipList; } if(argPostClipList!=null){ this.mPostClipList = argPostClipList; } } }catch (Exception ex){ex.printStackTrace();} } void getAPIValues(){ JSONObject mResponseObj=null; //ArrayList<HashMap<String, String>> mPreClipList = new ArrayList<>(); //ArrayList<HashMap<String, String>> mPostClipList = new ArrayList<>(); boolean hasHeader=false; boolean hasFooter=false; boolean canPostComments=false; boolean canTakeSurvey=false; boolean doNotAutoPublish=false; boolean doNotArchive=false; try { templateList.clear(); mResponseObj=new JSONObject(getResponse); try { String str_json_status = mResponseObj.optString(AppResponseTags.TAG_JSON_STATUS); if (str_json_status.equalsIgnoreCase(AppResponseTags.TAG_RESPONSE_SUCCESS)) { JSONObject clientResponse_obj = mResponseObj.optJSONObject(AppResponseTags.TAG_CLIENTRESPONSE); String str_totalRecords = clientResponse_obj.optString(AppResponseTags.TAG_TOTALRECORDS); JSONArray templateContent = clientResponse_obj.optJSONArray(AppResponseTags.TAG_DATA); try { if (!clientResponse_obj.isNull(AppResponseTags.TAG_DATA)) for (int templateCount = 0; templateCount < templateContent.length(); templateCount++) { JSONObject templateContent_Obj = templateContent.optJSONObject(templateCount); try { if (!templateContent_Obj.isNull(AppResponseTags.TAG_ID)) { str_templateId = templateContent_Obj.optString(AppResponseTags.TAG_ID); } else { str_templateId = ""; } if (!templateContent_Obj.isNull(AppResponseTags.TAG_NAME)) { str_templateName = templateContent_Obj.optString(AppResponseTags.TAG_NAME); } else { str_templateName = ""; } if (!templateContent_Obj.isNull(AppResponseTags.TAG_PRESIGNEDTHUMBNAILURL)) { str_templateImage = templateContent_Obj.optString(AppResponseTags.TAG_PRESIGNEDTHUMBNAILURL); } else { str_templateImage = ""; } if(!templateContent_Obj.isNull(AppResponseTags.TAG_DESCRIPTION)){ description=templateContent_Obj.optString(AppResponseTags.TAG_DESCRIPTION); }else{ description=""; } if(!templateContent_Obj.isNull(AppResponseTags.TAG_SCRIPT)){ scriptTxt=templateContent_Obj.optString(AppResponseTags.TAG_SCRIPT); }else{ scriptTxt=""; } ArrayList<HashMap<String, String>> mTempPreClipList = new ArrayList<>(); ArrayList<HashMap<String, String>> mTempPostClipList = new ArrayList<>(); if(!templateContent_Obj.isNull(AppResponseTags.TAG_PRECLIPS)) { JSONArray mPreClipArray =new JSONArray(); mPreClipArray = templateContent_Obj.optJSONArray(AppResponseTags.TAG_PRECLIPS); try { if (mPreClipArray != null && mPreClipArray.length() > 0) { try { System.out.println("*-------------------*********--------------------------*"); for (int i = 0; i < mPreClipArray.length(); i++) { HashMap<String, String> map = new HashMap<>(); try { JSONObject dataObject = mPreClipArray.getJSONObject(i); String mPreContenId = dataObject.getString(AppResponseTags.TAG_CONTENTID); map.put("preclipid", mPreContenId); mTempPreClipList.add(map); } catch (Exception ex) { ex.printStackTrace(); }finally { map=null; } System.out.println(str_templateName+"->"+"Array-Pos-PreClip-"+i); } } catch (Exception ex) { ex.printStackTrace(); } } } catch (Exception ex) { ex.printStackTrace(); } finally { //mPreClipList = null; mPreClipArray = null; } System.out.println("*-----------------------------------------------------------------------*"); System.out.println(str_templateName+"->"+"Array-Pos-PreClip Array-" + mTempPreClipList.size()); System.out.println("*---------------------========================--------------------------*"); } if(!templateContent_Obj.isNull(AppResponseTags.TAG_POSTCLIPS)) { JSONArray mPostClipArray =new JSONArray(); mPostClipArray = templateContent_Obj.getJSONArray(AppResponseTags.TAG_POSTCLIPS); try { if (mPostClipArray != null && mPostClipArray.length() > 0) { try { for (int i = 0; i < mPostClipArray.length(); i++) { HashMap<String, String> map = new HashMap<>(); JSONObject dataObject = mPostClipArray.getJSONObject(i); try { String mPostContenId = dataObject.getString(AppResponseTags.TAG_CONTENTID); map.put("postclipid", mPostContenId); mTempPostClipList.add(map); } catch (Exception ex) { ex.printStackTrace(); }finally { map=null; } System.out.println(str_templateName+"->"+"Array-Pos-PostClip-"+i); } } catch (Exception ex) { ex.printStackTrace(); } } } catch (Exception ex) { ex.printStackTrace(); } finally { //mPostClipList = null; mPostClipArray = null; } System.out.println("*-----------------------------------------------------------------------*"); System.out.println(str_templateName+"->"+"Array-Pos-PostClip Array-" + mTempPostClipList.size()); System.out.println("*---------------------========================--------------------------*"); } templateList.add(new TemplateModel(str_templateId, str_templateName, str_templateImage, temp_name,description,scriptTxt,mCallToActionType,mCallToActionLink,mCallToActionText,mAuthorEmailSignature, hasHeader, hasFooter, canPostComments, canTakeSurvey, doNotAutoPublish, doNotArchive, mChannelList,mTempPreClipList,mTempPostClipList)); } catch (Exception ex) { ex.printStackTrace(); } } catch (Exception ex) { ex.printStackTrace(); } } if (templateList.size() > 0) { mQikRecTemplateAdapter = new QikRecTemplateAdapter(getActivityContext, templateList, this, temp_name); rcyVw_ChooseTemplate.setAdapter(mQikRecTemplateAdapter); rcyVw_ChooseTemplate.setVisibility(View.VISIBLE); rcyVw_ChooseTemplate.getAdapter().notifyDataSetChanged(); } } catch (Exception ex) { ex.printStackTrace(); } } }catch (Exception ex){ex.printStackTrace();} } catch (JSONException e) { e.printStackTrace(); } } } 

堆棧跟蹤

 W/System.err: java.lang.NullPointerException: Attempt to invoke interface method 'void com.ibot.cyranoapp.interfaces.quickmessage.QikMsgTemplateListener.onTemplateSelectedDesc(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.util.ArrayList, java.util.ArrayList)' on a null object reference W/System.err: at com.ibot.cyranoapp.adapters.quickrecord.QikRecTemplateAdapter.lambda$onBindViewHolder$0(QikRecTemplateAdapter.java:279) W/System.err: at com.ibot.cyranoapp.adapters.quickrecord.-$$Lambda$QikRecTemplateAdapter$oPCYWC6_gHETxZtfdm5pQwAQTow.onClick(lambda) W/System.err: at android.view.View.performClick(View.java:6205) W/System.err: at android.widget.TextView.performClick(TextView.java:11103) W/System.err: at android.widget.CompoundButton.performClick(CompoundButton.java:130) W/System.err: at android.view.View$PerformClick.run(View.java:23653) W/System.err: at android.os.Handler.handleCallback(Handler.java:751) W/System.err: at android.os.Handler.dispatchMessage(Handler.java:95) W/System.err: at android.os.Looper.loop(Looper.java:154) W/System.err: at android.app.ActivityThread.main(ActivityThread.java:6682) W/System.err: at java.lang.reflect.Method.invoke(Native Method) W/System.err: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520) W/System.err: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410) 

在此代碼中,我添加了評論以更好地解釋我的問題。 提前致謝。

啟動適配器時,您的參數不匹配。 你的聽眾應該是第二個參數

我認為你的監聽器沒有正確初始化,因此它拋出了NullPointerException

嘗試為您的偵聽器創建一個setter,並在您的TemplatesFragment的onCreateView()方法上初始化:

public class QikRecTemplateAdapter extends RecyclerView.Adapter{

    private QikMsgTemplateListener mQikMsgTemplateListener;

    public void setQikMsgTemplateListener(QikMsgTemplateListener listener){
       mQikMsgTemplateListener = listener;
    }
    ...
    ...
}


public class TemplatesFragment extends Fragment implements View.OnClickListener, QikMsgTemplateListener {
        ArrayList<HashMap<String, String>> mPreClipList = new ArrayList<>();
        ArrayList<HashMap<String, String>> mPostClipList = new ArrayList<>();

        ....

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        ...
        //Initialize adapter before setting the listener.
        qikRecTemplateAdapter.setQikMsgTemplateListener(this)
        ...
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
    }

    @Override
    public void onDetach() {
      if(qikRecTemplateAdapter != null)
        qikRecTemplateAdapter.setQikMsgTemplateListener(null)

      super.onDetach();
    }
}

此外,為避免NullPointerException ,請始終在使用它的任何地方進行空安全檢查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM