2017-08-16 7 views
-1

Je suis confronté au problème dans les données JSON du serveur est enregistré dans le ArrayList retourne null lorsque l'ArrayList est appelée dans l'adaptateur personnalisé. L'adaptateur personnalisé est utilisé pour lister les données dans le spinner dans Android.Arraylist renvoie null dans la méthode asynchrone?

public class PhotoCommnFragment extends android.support.v4.app.Fragment { 
EditText rechargeMobileNumber,rechargeAmount; 
Spinner selectMenu; 
int flags[] = {R.drawable.airteltv, R.drawable.aircel, R.drawable.dishtv, R.drawable.sundirect, R.drawable.tatasky, R.drawable.videocon}; 
List<SpinnerMenu> selectedNetwork = new ArrayList<>(); 
public PhotoCommnFragment() { 
    // Required empty public constructor 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_tab_mobile, container, false); 
    mobileRecahrgeHistory(); 
    rechargeMobileNumber = (EditText)rootView.findViewById(R.id.recharge_mobile_number); 
    rechargeAmount = (EditText)rootView.findViewById(R.id.recharge_amount); 
    selectMenu = (Spinner)rootView.findViewById(R.id.selectNetwork); 
    settingSpinnerDropDown(); 
    return rootView; 
} 

public void mobileRecahrgeHistory(){ 
    Ion.with(this) 
      .load("http://192.168.1.105/TotalRecharge/?api=ol&uid=1") 
      .asJsonObject().withResponse() 
      .setCallback(new FutureCallback<Response<JsonObject>>() { 
       @Override 
       public void onCompleted(Exception e, Response<JsonObject> result) { 
        JSONObject json = null; 

        try { 
         json = new JSONObject(result.getResult().toString()); 
        } catch (JSONException e1) { 
         e1.printStackTrace(); 
        } 
        // Create the root JSONObject from the JSON string. 
        JSONObject jsonRootObject = null; 
        jsonRootObject = json.optJSONObject("DS"); 

        //Get the instance of JSONArray that contains JSONObjects 
        JSONArray jsonArray = jsonRootObject.optJSONArray("LST"); 

        //Iterate the jsonArray and print the info of JSONObjects 
        for(int i=0; i < jsonArray.length(); i++){ 
         JSONObject jsonObject = null; 
         try { 
          jsonObject = jsonArray.getJSONObject(i); 
         } catch (JSONException e1) { 
          e1.printStackTrace(); 
         } 
         String iph = null; 

         String oid = jsonObject.optString("OID").toString(); 
         String ocd = jsonObject.optString("OCD").toString(); 
         String opd = jsonObject.optString("OPE").toString(); 
         String mil = jsonObject.optString("MIL").toString(); 
         String mxl = jsonObject.optString("MXL").toString(); 
         try { 
          iph = jsonObject.getString("IPH").toString(); 
         } catch (JSONException e1) { 
          e1.printStackTrace(); 
         } 

         String urldisplay = "http://192.168.1.105/TotalRecharge/"+iph; 
         Bitmap mIcon11 = null; 
         try { 
          InputStream in = new java.net.URL(urldisplay).openStream(); 
          mIcon11 = BitmapFactory.decodeStream(in); 
         } catch (Exception e3) { 
          e3.printStackTrace(); 
         } 
         SpinnerMenu spinnerData = new SpinnerMenu(); 
         spinnerData.setOid(oid); 
         spinnerData.setOcd(ocd); 
         spinnerData.setOpd(opd); 
         spinnerData.setMil(mil); 
         spinnerData.setMix(mxl); 
         spinnerData.setImage(mIcon11); 

         selectedNetwork.add(spinnerData); 

        } 

       } 

      }); 
} 


public void settingSpinnerDropDown(){ 
    Fragment_DTH_Main_Spinner_Adapter customAdapter=new Fragment_DTH_Main_Spinner_Adapter(getActivity(),R.layout.fragment_dth_main_spinner_items,R.id.serviceName,selectedNetwork); 
    selectMenu.setAdapter(customAdapter); 
} 

dans la méthode AOVE les données à partir d'Internet sont enregistrées dans arraylist mais quand le arraylist est appelé à Fragment_DTH_Main_Spinner_Adapter` ArrayList retourne null. J'ai vérifié en déboguant les données sont enregistrer dans arraylist. J'ai renvoyé dans stackoverflow que vous devez ajouter le

Adapter.notifyDataSetChanged() dans votre méthode. Je ne sais pas où ajouter cette méthode. Dans ma méthode, la méthode asynchrone appelée avant d'appeler l'adaptateur personnalisé. Alors, quelle est l'utilité de l'utilisation de cette méthode. Aidez-moi, s'il vous plaît.

Le code ci-dessous classe d'adaptateur Fragment_DTH_Main_Spinner_Adapter

public class Fragment_DTH_Main_Spinner_Adapter extends ArrayAdapter<SpinnerMenu> { 
     Context context; 
    int flags[]; 
    List<SpinnerMenu> countryNames; 
    LayoutInflater inflter; 

    public Fragment_DTH_Main_Spinner_Adapter(FragmentActivity activity, int resouceId, int textviewId, List<SpinnerMenu> data) { 


    //  super(activity, R.layout.fragment_dth_main_spinner_items,userstories); 
     super(activity,resouceId,textviewId,data); 
     this.countryNames = data; 
    } 

    public class ViewHolder 
    { 
     TextView names; 
     ImageView icon; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     LayoutInflater inflater = LayoutInflater.from(getContext()); 
     convertView = inflater.inflate(R.layout.fragment_dth_main_spinner_items, parent, false); 
    //  convertView = inflter.inflate(fragment_dth_main_spinner_items, null); 
     SpinnerMenu spinnerData = countryNames.get(position); 
     ViewHolder viewHolder; 
     View result; 

     if(convertView == null){ 
      viewHolder = new ViewHolder(); 
      viewHolder.icon = (ImageView) convertView.findViewById(R.id.imageView); 
      viewHolder.names = (TextView) convertView.findViewById(R.id.serviceName); 
      result = convertView; 
     } 
     else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
      result = convertView; 
     } 
//  viewHolder.icon.setImageBitmap(spinnerData.getImage()); 
//  Glide.with(context).load(spinnerData.getImages()).into(viewHolder.icon); 
     viewHolder.names.setText(spinnerData.getOpd()); 
     return convertView; 
    } 
} 

Répondre

0

Faites votre customadapter mondiale et appelez notifydatasetchanged dans onComplete

public class PhotoCommnFragment extends android.support.v4.app.Fragment { 
    EditText rechargeMobileNumber, rechargeAmount; 
    Spinner selectMenu; 
    int flags[] = {R.drawable.airteltv, R.drawable.aircel, R.drawable.dishtv, R.drawable.sundirect, R.drawable.tatasky, R.drawable.videocon}; 
    List<SpinnerMenu> selectedNetwork = new ArrayList<>(); 
    Fragment_DTH_Main_Spinner_Adapter customAdapter; 

    public PhotoCommnFragment() { 
     // Required empty public constructor 
    } 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_tab_mobile, container, false); 
     mobileRecahrgeHistory(); 
     rechargeMobileNumber = (EditText) rootView.findViewById(R.id.recharge_mobile_number); 
     rechargeAmount = (EditText) rootView.findViewById(R.id.recharge_amount); 
     selectMenu = (Spinner) rootView.findViewById(R.id.selectNetwork); 
     settingSpinnerDropDown(); 
     customAdapter = new Fragment_DTH_Main_Spinner_Adapter(getActivity(), R.layout.fragment_dth_main_spinner_items, R.id.serviceName, selectedNetwork); 
     return rootView; 
    } 

    public void mobileRecahrgeHistory() { 
     Ion.with(this) 
       .load("http://192.168.1.105/TotalRecharge/?api=ol&uid=1") 
       .asJsonObject().withResponse() 
       .setCallback(new FutureCallback<Response<JsonObject>>() { 
        @Override 
        public void onCompleted(Exception e, Response<JsonObject> result) { 
         JSONObject json = null; 

         try { 
          json = new JSONObject(result.getResult().toString()); 
         } catch (JSONException e1) { 
          e1.printStackTrace(); 
         } 
         // Create the root JSONObject from the JSON string. 
         JSONObject jsonRootObject = null; 
         jsonRootObject = json.optJSONObject("DS"); 

         //Get the instance of JSONArray that contains JSONObjects 
         JSONArray jsonArray = jsonRootObject.optJSONArray("LST"); 

         //Iterate the jsonArray and print the info of JSONObjects 
         for (int i = 0; i < jsonArray.length(); i++) { 
          JSONObject jsonObject = null; 
          try { 
           jsonObject = jsonArray.getJSONObject(i); 
          } catch (JSONException e1) { 
           e1.printStackTrace(); 
          } 
          String iph = null; 

          String oid = jsonObject.optString("OID").toString(); 
          String ocd = jsonObject.optString("OCD").toString(); 
          String opd = jsonObject.optString("OPE").toString(); 
          String mil = jsonObject.optString("MIL").toString(); 
          String mxl = jsonObject.optString("MXL").toString(); 
          try { 
           iph = jsonObject.getString("IPH").toString(); 
          } catch (JSONException e1) { 
           e1.printStackTrace(); 
          } 

          String urldisplay = "http://192.168.1.105/TotalRecharge/" + iph; 
          Bitmap mIcon11 = null; 
          try { 
           InputStream in = new java.net.URL(urldisplay).openStream(); 
           mIcon11 = BitmapFactory.decodeStream(in); 
          } catch (Exception e3) { 
           e3.printStackTrace(); 
          } 
          SpinnerMenu spinnerData = new SpinnerMenu(); 
          spinnerData.setOid(oid); 
          spinnerData.setOcd(ocd); 
          spinnerData.setOpd(opd); 
          spinnerData.setMil(mil); 
          spinnerData.setMix(mxl); 
          spinnerData.setImage(mIcon11); 

          selectedNetwork.add(spinnerData); 
          customAdapter.notifyDataSetChanged(); 

         } 

        } 

       }); 
    } 


    public void settingSpinnerDropDown() { 

     selectMenu.setAdapter(customAdapter); 
    } 
+0

l'adaptateur personnalisé est initialisé après la méthode asynchrone, mais adapter.notifyDataSetChanged() est appelée à l'intérieur de la méthode asynchrone. Cela provoquera-t-il l'exception du pointeur nul –

+0

Cela ne devrait/ne devrait pas causer un pointeur nul. S'il vous plaît essayez le –

+0

Encore le problème n'est pas résolu, ses valeurs null de retour –