PDA

Ver la Versión Completa : [ CONSULTA ] setTextColor desde el ArrayList (ayuda)


gonza28
11/01/16, 01:56:44
Hola. Por favor necesito saber esto ya que no pude lograr.

Tengo un recycler view. los datos vienen desde un modelo estatico.

Todos los items son numeros. Pero necesito definir desde el modelo algunos colores para los numeros ya que algunos de ellos son de distintos colores.

Por favor, hace 2 dias que vengo en la lucha sin exito. Muesto lo que hice y no me funciona.

Modelo:

public class ModelEquivalent {

private String tapSize;
private int azul;

public ModelEquivalent(String tapSize , int azul) {
this.tapSize = tapSize;
this.azul = azul;


}

public static final List<ModelEquivalent> DecimalEquivalents = new ArrayList<>();

static {
DecimalEquivalents.add(new ModelEquivalent(".0135", R.color.azul_item));
}

public String getTapSize() {
return tapSize;
}
public int getAzul() {return azul;}

}

Adapter:

public class Adaptador_Equivalent
extends RecyclerView.Adapter<Adaptador_Equivalent.ViewHolder> {


private final List<ModelEquivalent> items;

public static class ViewHolder extends RecyclerView.ViewHolder {
// Campos respectivos de un item
public TextView tapSize;
public TextView azul;

public ViewHolder(View v) {
super(v);

tapSize = (TextView) v.findViewById(R.id.textTapSize);
azul = (TextView) v.findViewById(R.id.textTapSize);


}

public Adaptador_Equivalent(List<ModelEquivalent> items) {
this.items = items;
}

override
public int getItemCount() {
return items.size();
}

override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.item_technical_equivalent, viewGroup, false);
return new ViewHolder(v);
}

override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
ModelEquivalent item = items.get(i);

viewHolder.tapSize.setText(item.getTapSize());
viewHolder.azul.setTextColor(item.getAzul());




}


}


Hay mas contenidos, pero lo reduje para que sea mas chico el post y sea mas claro.
Ojalá alguien me de una mano.
Bueno, seguro estoy haciendo mal.
Necesito una mano amigos por favor. así como lo estoy haciendo no me funciona.

Un saludo

kriogeN
11/01/16, 07:20:53
El setTextColor aplica directamente un color en formato hexadecimal, no aplica el color contenido en un Resource.

Es decir, si tu color es el azul será algo parecido a esto: 0xFF0000FF. Supongamos que es ese, si no lo es será próximo.

Bien, eso lo almacenas en un Resource, al que accedes mediante R.color.azul_item, que es una referencia. Es como si fuese un puntero de C, el valor contenido en R.color.azul_item es el color azul, pero realmente su valor será un número entero, por poner un ejemplo, el 727 (cada vez que recompilas tu aplicación ese valor cambia).

Es decir, realmente estás aplicando:

viewHolder.azul.setTextColor(727);

En lugar de aplicar:

viewHolder.azul.setTextColor(0xFF0000FF);

¿Cómo se soluciona? Obteniendo el valor del color de forma correcta, es decir, el valor contenido en el recurso, que sería así:

ContextCompat.getColor(context, R.color.azul_item);

getResources() está deprecated en Android 6.0.

Eso puedes hacerlo en el modelo, cuando recuperas el color (sería el sitio más correcto), así que tu código sería:

DecimalEquivalents.add(new ModelEquivalent(".0135", ContextCompat.getColor(context, R.color.azul_item)));

gonza28
11/01/16, 09:46:10
El setTextColor aplica directamente un color en formato hexadecimal, no aplica el color contenido en un Resource.

Es decir, si tu color es el azul será algo parecido a esto: 0xFF0000FF. Supongamos que es ese, si no lo es será próximo.

Bien, eso lo almacenas en un Resource, al que accedes mediante R.color.azul_item, que es una referencia. Es como si fuese un puntero de C, el valor contenido en R.color.azul_item es el color azul, pero realmente su valor será un número entero, por poner un ejemplo, el 727 (cada vez que recompilas tu aplicación ese valor cambia).

Es decir, realmente estás aplicando:

viewHolder.azul.setTextColor(727);

En lugar de aplicar:

viewHolder.azul.setTextColor(0xFF0000FF);

¿Cómo se soluciona? Obteniendo el valor del color de forma correcta, es decir, el valor contenido en el recurso, que sería así:

ContextCompat.getColor(context, R.color.azul_item);

getResources() está deprecated en Android 6.0.

Eso puedes hacerlo en el modelo, cuando recuperas el color (sería el sitio más correcto), así que tu código sería:

DecimalEquivalents.add(new ModelEquivalent(".0135", ContextCompat.getColor(context, R.color.azul_item)));

tocando un poco, llego a la nada misma y seguro que será por mi corto trato con los colores.

http://i.imgur.com/xNMKf9U.png

kriogeN
11/01/16, 21:52:33
Pues debería funcionarte haciéndolo así. ¿Si pones el color a piñón te funciona?

Es decir, si pones:

public int getAzul() { return 0xFFFF0000; }

Debería salirte rojo, si no sale rojo el fallo lo tienes en otra parte.

gonza28
12/01/16, 22:25:07
Pues debería funcionarte haciéndolo así. ¿Si pones el color a piñón te funciona?

Es decir, si pones:

public int getAzul() { return 0xFFFF0000; }

Debería salirte rojo, si no sale rojo el fallo lo tienes en otra parte.

Hice un switch en el adapter. y funciona bastante bien. porque digo bastante?
pues no se porque me asigna color a algun item al cual no lo estoy incluyendo en el case.

mi lista maneja la mayoria de los items son azules. entonces en el layout le puse el color azul.
A las vriantes que rojo, verde y negro son menos numeros. como 10 nada mas. Asi que a estos pretengo modificar el color.

Por lo desesperado cree este case y funciona un 90% porque me cambia el color a algun numero al cual no lo incluyo en el case.

switch (item.getTapSize()) {
case ".0156":
viewHolder.tapSize.setTextColor(Color.parseColor("#FFE74C3C"));
break;
case ".0197":
//verde
viewHolder.tapSize.setTextColor(Color.parseColor("#FF16A085"));
break;
case ".0312":
//rojo
viewHolder.tapSize.setTextColor(Color.parseColor("#FFE74C3C"));
break;
case ".0394":
viewHolder.tapSize.setTextColor(Color.parseColor("#FF16A085"));
break;
case ".0469":
viewHolder.tapSize.setTextColor(Color.parseColor("#FFE74C3C"));
break;
case ".0591":
viewHolder.tapSize.setTextColor(Color.parseColor("#FF16A085"));
break;
case ".0625":
viewHolder.tapSize.setTextColor(Color.parseColor("#FFE74C3C"));
break;
case ".0669":
viewHolder.tapSize.setTextColor(Color.parseColor("#FF16A085"));
break;