2016-04-06 14 views
1

Ich versuche, eine Liste von Schaltflächen mit Text gepaart zu erstellen. Wenn auf eine Schaltfläche in der Liste geklickt wird, möchte ich den Ganzzahlwert in der zugehörigen Textansicht erhöhen. Mein Plan war, den folgenden Code zu verwenden, aber ich habe einen Fehler mit viewHolder innerhalb der OnClickListener weil viewHolder ist nicht endgültig, und es kann nicht sein, um es innerhalb der onClick zu manipulieren. Wie kann ich den zugehörigen Textwert ändern?ListView mit Button, mit ViewHolder innerhalb OnClick

public View getView(final int position, View convertView, ViewGroup parent){ 
    ViewHolder viewHolder = null; 
    if (convertView == null) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     convertView = inflater.inflate(R.layout.row, null); 
     viewHolder = new ViewHolder(); 
     viewHolder.text = (TextView) convertView.findViewById(R.id.playerScore); 
     viewHolder.button = (Button) convertView.findViewById(R.id.playerButton); 
     viewHolder.button.setOnClickListener(new View.OnClickListener() { 
      protected String scoreToSet; 
      @Override 
      public void onClick(View v) { 
       viewHolder.text.setText(Integer.toString(modelList.get(position).getScore() + 1)); //Error is occurring here 
      } 
     }); 
     convertView.setTag(viewHolder); 
    } 
    else{ 
     viewHolder = (ViewHolder) convertView.getTag(); 
     viewHolder.button.setText(modelList.get(position).getPlayer()); 
    } 
    return convertView; 
} 

Danke für die Hilfe!

Antwort

0

Ändern Sie den Code wie folgt,

public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder viewHolder ; 
     if (convertView == null) { 
      LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
      convertView = inflater.inflate(R.layout.row, null); 
      viewHolder = new ViewHolder(); 
      viewHolder.text = (TextView) convertView.findViewById(R.id.playerScore); 
      viewHolder.button = (Button) convertView.findViewById(R.id.playerButton); 
      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
      viewHolder.button.setText(modelList.get(position).getPlayer()); 
     } 

     viewHolder.button.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       //TODO UPDATE the model here 
       int newScore = modelList.get(position).getScore() + 1; 
       modelList.get(position).setScore(newScore); 
       viewHolder.text.setText(Integer.toString(newScore); 
      } 
     }); 

     return convertView; 
    } 
0

Sie Hörer oder eingestellten Werte auf Ihre Ansichten außerhalb if-else-Blöcke hinzufügen sollten -

public View getView(final int position, View convertView, ViewGroup parent){ 
     ViewHolder viewHolder = null; 
     if (convertView == null) { 
      LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
      convertView = inflater.inflate(R.layout.row, null); 
      viewHolder = new ViewHolder(); 
      viewHolder.text = (TextView) convertView.findViewById(R.id.playerScore); 
      viewHolder.button = (Button) convertView.findViewById(R.id.playerButton); 
      convertView.setTag(viewHolder); 
     } 
     else{ 
      viewHolder = (ViewHolder) convertView.getTag(); 

     } 
     viewHolder.button.setText(modelList.get(position).getPlayer()); 

      viewHolder.button.setOnClickListener(new View.OnClickListener() { 
       protected String scoreToSet; 
       @Override 
       public void onClick(View v) { 
        setValue(position); 
       } 
      }); 
     return convertView; 
    } 

setValue() Deklarieren -

public void setValue(int position){ 
    ViewHolder.text.setText(Integer.toString(modelList.get(position).getScore() + 1)); 
}