2017-06-29 2 views
0

Je crée une application avec une liste qui liste les cartes en fonction de la valeur du serveur. J'ai créé un StudentCardArrayAdapter pour y parvenir et tout fonctionne correctement. Toutes les données ont été renseignées dans la liste des cartes. aussi je peux obtenir les valeurs sur le clic de bouton dans chaque carte séparément. Ce dont j'ai besoin est de cliquer sur le bouton, il appelle une méthode serveur de requête pour les données de manière asynchrone et obtenir une valeur du serveur et en fonction de cette valeur, j'ai besoin de changer le texte du bouton dans cette carte particulière.Impossible d'accéder à viewHolder dans un customArrayadapter dans une autre fonction?

Mon code StudentCardArrayAdapter:

public class StudentCardArrayAdapter extends ArrayAdapter<StudentCard> { 
    private static final String TAG = "CardArrayAdapter"; 
    private List<StudentCard> cardList = new ArrayList<StudentCard>(); 
    private Context mContext; 
    String selected = "0"; 
    PreferenceHelper prefs; 
    CardViewHolder viewHolder; 
    View row; 
    ProgressDialog pd; 
    static class CardViewHolder { 
     TextView studentname; 
     TextView stop; 
     Button selectbutton; 
     CircleImageView imageId; 

    } 

    public StudentCardArrayAdapter(Context context, int textViewResourceId) { 
     super(context, textViewResourceId); 
     this.mContext = context; 
     prefs = new PreferenceHelper(this.mContext); 
     pd = new ProgressDialog(this.mContext); 
    } 

    @Override 
    public void add(StudentCard object) { 
     cardList.add(object); 
     super.add(object); 
    } 

    @Override 
    public int getCount() { 
     return this.cardList.size(); 
    } 

    @Override 
    public StudentCard getItem(int index) { 
     return this.cardList.get(index); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     row = convertView; 
     if (row == null) { 
      LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      row = inflater.inflate(R.layout.student_card, parent, false); 
      viewHolder = new CardViewHolder(); 
      viewHolder.studentname = (TextView) row.findViewById(R.id.studentname); 
      viewHolder.stop = (TextView) row.findViewById(R.id.stop); 
      viewHolder.selectbutton = (Button) row.findViewById(R.id.selectbutton); 
      viewHolder.imageId = (CircleImageView) row.findViewById(R.id.imageId); 
      row.setTag(viewHolder); 
     } else { 
      viewHolder = (CardViewHolder)row.getTag(); 
     } 
     StudentCard card = getItem(position); 

     viewHolder.studentname.setText(card.getStudName()); 
     viewHolder.studentname.setTextColor(Color.parseColor("#000000")); 

     viewHolder.stop.setText(card.getStudStop()); 
     viewHolder.stop.setTextColor(Color.parseColor("#000000")); 

     if(card.getSelected().equals("1")){ 
      viewHolder.selectbutton.setText(mContext.getResources().getString(R.string.selected)); 
      viewHolder.selectbutton.setEnabled(false); 
     } 
     else{ 
      viewHolder.selectbutton.setText(mContext.getResources().getString(R.string.select)); 
      viewHolder.selectbutton.setEnabled(true); 
     } 

     final String studid = card.getStudId(); 
     final String busname = prefs.getString("busname", "0"); 
     final String schoolid = prefs.getString("schoolid", ""); 
     viewHolder.selectbutton.setOnClickListener(new View.OnClickListener() 
     { 
      String updatedvalue = "0"; 
      @Override 
      public void onClick(View v) 
      { 
       Log.e("studid",studid); 
       Log.e("busname",busname); 
       Log.e("schoolid",schoolid); 
        selectstudent(v, studid, busname, schoolid,mContext); 
       //Toast.makeText(v.getContext(), amountinfo, Toast.LENGTH_SHORT).show(); 
       /*SnackbarManager.show(Snackbar.with(this) // context 
         .text(amountinfo));*/ 
      } 
     }); 
     Picasso.with(mContext).load(card.getImageUrl()).fit().error(R.mipmap.ic_launcher).into(viewHolder.imageId); 
     return row; 
    } 


    public void selectstudent(final View v, String studid, String busname, String schoolid, final Context mContext) { 
     String returnedselected = "0"; 
     Log.e("BASE_URL_STUDENT_UPDATE", Constants.BASE_URL_STUDENT_UPDATE + "?studid=" + studid+"&busname="+busname+"&schoolid="+schoolid); 
     RestClientHelper.getInstance().get(Constants.BASE_URL_STUDENT_UPDATE + "?studid=" + studid+"&busname="+busname+"&schoolid="+schoolid, new RestClientHelper.RestClientListener() { 
      @Override 
      public void onSuccess(String response) { 
       Log.e("RESULT", response); 
       try { 

        JSONObject result = new JSONObject(response); 
        JSONArray posts = result.optJSONArray("status"); 
        for (int i = 0; i < posts.length(); i++) { 
         JSONObject post = posts.optJSONObject(i); 
         String status = post.optString("status"); 
         if (status.equals("true")) { 
          selected = post.optString("selected"); 
         } else { 
          selected = post.optString("selected"); 
          String error = post.optString("error"); 
          SnackbarManager.show(Snackbar.with(getContext()) // context 
            .text(error)); 
         } 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 

       } catch (Exception e) { 

       } finally { 
        if(selected.equals("1")){ 
         viewHolder.selectbutton.setText(mContext.getResources().getString(R.string.selected)); 
         viewHolder.selectbutton.setEnabled(false); 
        } 

       } 
      } 

      @Override 
      public void onError(String error) { 
       Log.e("error", error); 
       selected = "0"; 
      } 
     }); 
    } 
} 

J'ai utilisé le code ci-dessous, mais rien ne fonctionne .. Pas d'erreur aussi .. et ne pas changer de bouton text.I obtenir une valeur de 1 sélectionnée comme du serveur.

if(selected.equals("1")){ 
         viewHolder.selectbutton.setText(mContext.getResources().getString(R.string.selected)); 
         viewHolder.selectbutton.setEnabled(false); 
        } 

Je suis nouveau à android .. et est coincé ici. Sil te plait aide moi.

ENFIN TRAVAILLEES

Comme les changements mentionnent par Krish, je mis à jour le code proposé par lui. et a ajouté cela change en onClick il a travaillé

if(card.getSelected().equals("1")){ 
        viewHolder.selectbutton.setText(mContext.getResources().getString(R.string.selected)); 
        viewHolder.selectbutton.setEnabled(false); 
       } 

Répondre

0

Modifier le code comme celui-ci,

public void selectstudent(StudentCard card, String studid, String busname, String schoolid, final Context mContext) { 
     String returnedselected = "0"; 
     Log.e("BASE_URL_STUDENT_UPDATE", Constants.BASE_URL_STUDENT_UPDATE + "?studid=" + studid+"&busname="+busname+"&schoolid="+schoolid); 
     RestClientHelper.getInstance().get(Constants.BASE_URL_STUDENT_UPDATE + "?studid=" + studid+"&busname="+busname+"&schoolid="+schoolid, new RestClientHelper.RestClientListener() { 
      @Override 
      public void onSuccess(String response) { 
       Log.e("RESULT", response); 
       try { 

        JSONObject result = new JSONObject(response); 
        JSONArray posts = result.optJSONArray("status"); 
        for (int i = 0; i < posts.length(); i++) { 
         JSONObject post = posts.optJSONObject(i); 
         String status = post.optString("status"); 
         if (status.equals("true")) { 
          selected = post.optString("selected"); 
         } else { 
          selected = post.optString("selected"); 
          String error = post.optString("error"); 
          SnackbarManager.show(Snackbar.with(getContext()) // context 
            .text(error)); 
         } 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 

       } catch (Exception e) { 

       } finally { 
        if(selected.equals("1")){ 
         card.setSelected("1"); 
         notifyDataSetChanged(); 
        } 
       } 
      } 

      @Override 
      public void onError(String error) { 
       Log.e("error", error); 
       selected = "0"; 
      } 
     }); 
    } 

et changer cette ligne comme celui-ci,

final StudentCard card = getItem(position); 

et méthode d'appel à l'intérieur onclick.

selectstudent(card, studid, busname, schoolid,mContext); 
+0

Je dois changer le texte du bouton à l'intérieur de la carte. Est-ce possible avec cette méthode? – Karthi