2017-04-25 7 views
-1

Ich habe eine ListView mit einer CustomAdapter und ich kann die Farbe der angeklickten Zeile ändern. Aber ich muss die Farbe ändern, wenn der Benutzer nach der Antwort (es ist eine Quiz-App), und ich habe versucht, eine öffentliche Methode, um es von meinem MainActivity aufrufen, aber ich habe einen Fehler.Wie ändert man bestimmte Zeile/Zeile Farbe in ListView Android?

MyCustomAdapter Code:

@Override 
public View getView(final int position, final View convertView, final ViewGroup parent) { 
    // TODO Auto-generated method stub 
    final Holder holder=new Holder(); 
    View rowView; 
    rowView = inflater.inflate(R.layout.row_item, null); 
    lista = parent; 
    holder.tv=(io.github.kexanie.library.MathView) rowView.findViewById(R.id.texto); 
    holder.row=(RelativeLayout) rowView.findViewById(R.id.row); 
    holder.img=(ImageView) rowView.findViewById(R.id.imagem); 
    holder.tv.setText(result[position]); 
    holder.img.setImageResource(imageId[position]); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     holder.tv.setLayerType(View.LAYER_TYPE_HARDWARE, null); 
    } else { 
     holder.tv.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
    } 
    holder.tv.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH); 
    holder.tv.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); 

    rowView.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 

    //Paint the clicked line, and remove color from the unclicked lines. 

      for (int j = 0; j < 5; j++) { 
       parent.getChildAt(j).setBackgroundResource(R.color.branco); 
       if (j != position) { 
        status[j] = false; 
       } 
      } 

      if(!status[position]) { 
       holder.row.setBackgroundResource(R.color.azul); 
       status[position] = true; 
       respostas = ((MyApplication) simulado.getApplication()).getRespostas(); 
       mudarAlternativa(position); 
      }else{ 
       holder.row.setBackgroundResource(R.color.branco); 
       status[position] = false; 
       mudarAlternativa(5); 
      } 

     } 
    }); 
    return rowView; 
} 

eine Linie zu malen, habe ich parent.getChildAt(position).setBackgroundResource(R.color.mycolor); und es funktioniert, aber ich will es malen, ein Verfahren unter Verwendung von:

public void paintAnswer(int answerPosition){ 
    parent.getChildAt(j).setBackgroundResource(R.color.green); 
    } 

aber ich kann nicht parent verwenden Also initialisierte ich ViewGroup lista; und setzte lista auf getView. lista = parent. Also hat ich versucht:

öffentliche Methode auf Adapter:

public void paintAnswer(int answerPosition){ 
    lista.getChildAt(j).setBackgroundResource(R.color.green); 
    } 

Aufruf von meinem MainActivity:

adapter.paintAnswer(2); 

und ich habe ein erro. "verursacht durch: java.lang.NullPointerException: Versuch, die virtuelle Methode aufzurufen" android.view.View android.view.ViewGroup.getChildAt (int) 'für eine Null-Objektreferenz ".

Wie kann ich parent außerhalb getView verweisen, um die Linien mit einer öffentlichen Methode zu malen?

Antwort

0

Durch Setzen von Ansichten innerhalb onClick-Listener, bringen Sie die Logik in die Ansichten selbst, dieser Ansatz ist nicht vollständig richtig. Es kann sinnvoll sein, aber nur Ressourcen zu sparen, und nicht ganze Liste zu aktualisieren. Ich würde auch nicht auf Kinderpositionen der parent angewiesen, um eine bestimmte Ansicht zu erhalten, da die Ansichten für Zeilen in ListView wiederverwendbar sind und die gleiche Ansicht unterschiedliche Entitäten darstellen kann.

Setzen Sie diese Logik stattdessen in die Implementierung getView, damit die wiederverwendbaren Ansichten ihren Status nicht beibehalten müssen. Ein Gegenstand sollte seinen Zustand kennen und sagen, dass er sich jedes Mal, wenn die Ansicht auf die getView -Methode kommt, entsprechend anpassen muss.

+0

Danke. Ich bin freundlich in diesem Bereich, können Sie mir ein kleines Beispiel zeigen, einen Link, eine ähnliche Frage, etc? –

+0

Ich habe über was Sie gesagt, und ich ändere die ListView To Five LinearLayout und es ist viel einfacher zu manipulieren. –

+0

@GLAPPsMobile, wenn Sie eine feste Anzahl von Ansichten haben, ist es sinnvoll, vordefinierte Ansichten statt "ListView" zu verwenden. –

Verwandte Themen