2017-04-03 2 views
0

J'ai un fragment appelé MyRequestFragment, qui contient un RecyclerView et lier les données au RecyclerView en utilisant onBindViewHolder() en utilisant ma classe d'adaptateur.Impossible d'appeler runOnUiThread()

Maintenant, chaque ViewHolder j'ai un bouton. et pour chaque clic sur le bouton, une requête POST est renvoyée vers le serveur et met à jour une valeur. Mon problème est, si une réponse de succès vient, je dois cacher le bouton sur le particulier ViewHolder.

Le problème réel est le runOnUiThread() n'est pas acceptée sur le onBindViewHolder()

runOnUiThread(new Runnable() { 
    public void run() { 

    } 
}); 

Comment appeler cette méthode dans la ViewHolder créer/bind. Le code à onBindViewHolder() est disponible ci-dessous.

@Override 
    public void onBindViewHolder(MyServiceViewHolder holder, int position) { 
     final MyServiceBean myServiceBean = serviceList.get(position); 
     holder.service_name.setText(myServiceBean.getService_name()); 
     holder.last_updated.setText("Job Updated Date : " +myServiceBean.getDate(myServiceBean.getUpdated_at())); 
     holder.created_date.setText("Job Created Date : " + myServiceBean.getDate(myServiceBean.getCreated_at())); 
     holder.status.setText(myServiceBean.getStatus()); 
     holder.service_note.setText("Service Note : " + myServiceBean.getService_note()); 
     if (myServiceBean.getService_note().toString().isEmpty()) 
      holder.service_note.setVisibility(View.GONE); 

     switch (myServiceBean.getStatus().toString().toLowerCase()) { 
      case "completed": 
       holder.status.setBackgroundColor(Color.GREEN); 
       break; 
      case "on progress": 
       holder.status.setBackgroundColor(Color.YELLOW); 
       break; 
      case "canceled": 
       holder.status.setBackgroundColor(Color.RED); 
       break; 
      case "rejected": 
       holder.status.setBackgroundColor(Color.RED); 
       break; 
      case "accept": 
       holder.status.setBackgroundColor(Color.BLUE); 
       break; 
      default: 
       holder.status.setBackgroundColor(Color.GRAY); 
       break; 
     } 

     if(myServiceBean.getEst_amount() != null) { 
      holder.estimation_region.setVisibility(View.VISIBLE); 
      holder.est_status.setText("Estimation is Available"); 
      holder.btn_approve.setVisibility(View.VISIBLE); 

      holder.est_amount.setText("Estimation Amount: " + myServiceBean.getEst_amount()); 
      if(myServiceBean.getEst_note() != null) 
       holder.est_note.setText("Estimation Note: " + myServiceBean.getEst_note()); 
      if(myServiceBean.getEst_presented_by() != null) 
       holder.est_presented_by.setText("Estimation Prepared By: " + myServiceBean.getEst_presented_by()); 

      if(myServiceBean.getEst_approved_by_customer() == "true"){ 
       holder.btn_approve.setVisibility(View.GONE); 
       holder.est_status.setText("Estimation Approved on : " + myServiceBean.getEst_approved_date()); 
      }else{ 
       holder.btn_approve.setVisibility(View.VISIBLE); 
      } 

     }else{ 
      holder.estimation_region.setVisibility(View.GONE); 
      holder.est_status.setText("Estimation on Process"); 
      holder.btn_approve.setVisibility(View.GONE); 
     } 

     holder.btn_approve.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       updateRequest(); 
      } 
     }); 




    } 

    private void updateRequest() { 
     JSONObject jsonObject = new JSONObject(); 
     try { 
      jsonObject.put("est_approved_by_customer", true); 
      jsonObject.put("est_approved_date", "2017-10-30"); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     //progress_dialog.show(); 
     OkHttpClient client = new OkHttpClient(); 

     MediaType JSON = MediaType.parse("application/json; charset=utf-8"); 
     okhttp3.RequestBody body = RequestBody.create(JSON, jsonObject.toString()); 


     okhttp3.Request request = new Request.Builder() 
       .url(ApplicationContants.BASE_URL + ApplicationContants.MY_SERVICE_APPROVE_URL) 
       .post(body) 
       .build(); 

     client.newCall(request).enqueue(new Callback() { 
      @Override 
      public void onFailure(Call call, final IOException e) { 

      } 

      @Override 
      public void onResponse(Call call, Response response) throws IOException { 
       try { 
        String responseString = response.body().string(); 

        JSONObject jsonObject = new JSONObject(responseString); 
        Gson gson = new Gson(); 
        final MyServiceBean myServiceBean = gson.fromJson(jsonObject.toString(), MyServiceBean.class); 

        runOnUiThread(new Runnable() { 
         public void run() { 

         } 
        }); 

       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 
+0

double possible de [Malheureusement MyApp a arrêté. Comment puis-je résoudre ce problème?] (Http://stackoverflow.com/questions/23353173/unheureusement-myapp-has-stopped-how-can-i-solve-this) –

+0

Veuillez inclure le journal des erreurs – lal

+0

@lal en fait le code n'est pas compilé. Parce que runOnUiThread est une erreur de syntaxe. Il montre en rouge – nifCody

Répondre

2

runOnUiThread() est un procédé de Activity.

Soit appeler sur une Activity instance (si vous avez accès à un), ou utilisez un Handler pour poster votre Runnable à la file d'attente de messages du thread principal:

new Handler(Looper.getMainLooper()).post(new Runnable() { 
    public void run() { 
     // do something 
    } 
});