2017-06-29 50 views
0

我正在創建一個列表,根據服務器的值列出卡片的應用程序。 我創建了一個StudentCardArrayAdapter來實現這一切,一切工作正常。所有數據已填充到卡片列表中。我也能夠單獨獲取每張卡上的按鈕點擊值。無法訪問另一個函數中的customArrayadapter中的viewHolder?

我需要的是點擊按鈕,它將異步調用數據的方法請求服務器,並從服務器獲取值,並根據該值,我需要更改該特定卡中的按鈕文本。

我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"; 
      } 
     }); 
    } 
} 

我用下面的代碼,但沒有工作,不能有錯誤也..和按鈕不會改變text.I得到選爲1從服務器值。

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

我是新來的android ..和卡在這裏。請幫助我。

最後,通過Krish保護正常工作

隨着變化提起,我更新了他所提出的代碼。 ,並將此改變的onClick它的工作

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

回答

0

更改這樣的代碼,

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

和改變這一行就是這樣,

final StudentCard card = getItem(position); 

和呼叫方法中的onclick。

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

我需要更改卡內的按鈕的文本。這是可能的這種方法 – Karthi

相關問題