我有一个['cl1', 'cl2', 'cl3']
,其中每行有三个TextView,显示有关名为Medidor(Meter)的对象的信息。
我的问题是:当onClick事件发生时,如何将整行标记为已选中?如果选择,我只需要使当前行颜色变暗,否则返回正常。
我考虑在包含对象的列表上使用setOnItemClickListener(我ListView
上ArrayList<Medidor> medidores
,但我不确切地知道它与Activity
的确切关系,具体而言到Adapter
方法,以使其工作。
这是我的适配器的代码:
getView
与颜色相关的东西为&#34;行&#34;选择背景颜色。 (通过TextView对象),以便在视觉上分离具有不同属性值(位置)的Medidor对象。
这是fila_medidor.xml(其中三个TextView对象在&#34;行&#34;中定义):
public class ListaMedidoresAdapter extends BaseAdapter {
private ArrayList<Medidor> medidores;
private Activity activity;
private TextView codMedidor;
private TextView nombreMedidor;
private TextView obsLectMedidor;
static Long cod_medidor_seleccionado = 0L;
private static final Boolean COLORES_UBICS_ALTERN = false; //false para agrupar las ubicaciones en colores distintos para cada ubicación
private static final String[] colores_tabla = {"#770077","#002222","#228822","#881133","#602000","#202020","#6432c8","#c8323e","#32c870","#32a9c8","#c8b632","#c84f32","#383332","#6a7c68","#72687c","#590346","#5652c4","#404c33","#4a13ef","#ef6013",
"#724c12","#062307","#159fb5","#77797a","#107ea3","#a31010","#663c3c","#a00088","#383637","#662222","#224466","#5c748c","#8c875c","#5c8c80","#70962a","#3722f4","#a36758","#8e5518","#61188e","#af0150",
"#214add","#697293","#4f5466","#02686d","#2d026d","#7b6899","#50ba5f","#e85e27","#a4ba01","#ff0026"};
private static final String[] colores_altern = {"#2b7f4a","#7f2b30"};
private String color_seleccionado_conjunto = "";
private ArrayList<Integer> colores_seleccionados;
private Integer color_selecc;
private Context ctx;
ListaMedidoresAdapter(Activity activity, ArrayList<Medidor> listaMedidores, Context ctx){
super();
this.activity = activity;
this.medidores = listaMedidores;
this.ctx = ctx;
colores_seleccionados = new ArrayList<>();
color_selecc = 0;
}
@Override
public int getCount() {
return medidores.size();
}
@Override
public Medidor getItem(int i) {
return medidores.get(i);
}
@Override
public long getItemId(int i) {
return 0;
}
@SuppressLint("Range")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = activity.getLayoutInflater();
if(convertView == null){
convertView = inflater.inflate(R.layout.fila_medidor,null);
codMedidor = convertView.findViewById(R.id.codigo_medidor);
nombreMedidor = convertView.findViewById(R.id.nombre_medidor);
obsLectMedidor = convertView.findViewById(R.id.estado_lects_medidor);
}
Medidor m = medidores.get(position);
nombreMedidor.setText(m.getNombre());
obsLectMedidor.setText(m.getLecturaStatus());
obsLectMedidor.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
if(m.getCodigo_medidor() == null){ //Es cabecera de ubicación
nombreMedidor.setTypeface(null, Typeface.BOLD);
if(COLORES_UBICS_ALTERN){ //Seleccionar alternadamente entre dos colores
codMedidor.setBackgroundColor(Color.parseColor(colores_altern[color_selecc]));
nombreMedidor.setBackgroundColor(Color.parseColor(colores_altern[color_selecc]));
obsLectMedidor.setBackgroundColor(Color.parseColor(colores_altern[color_selecc]));
color_selecc = (color_selecc == 0) ? 1:0;
} else { //Seleccionar un color al azar
color_seleccionado_conjunto = seleccionarColor();
codMedidor.setBackgroundColor(Color.parseColor(color_seleccionado_conjunto));
nombreMedidor.setBackgroundColor(Color.parseColor(color_seleccionado_conjunto));
obsLectMedidor.setBackgroundColor(Color.parseColor(color_seleccionado_conjunto));
}
} else { //Es un medidor
if(COLORES_UBICS_ALTERN){ //Seleccionar alternadamente entre dos colores
codMedidor.setBackgroundColor(Color.parseColor(colores_altern[color_selecc]));
nombreMedidor.setBackgroundColor(Color.parseColor(colores_altern[color_selecc]));
color_selecc = (color_selecc == 0) ? 1:0;
} else { //Seleccionar un color al azar
codMedidor.setBackgroundColor(Color.parseColor(color_seleccionado_conjunto));
nombreMedidor.setBackgroundColor(Color.parseColor(color_seleccionado_conjunto));
}
if(m.getCodigo_medidor() != null){
String codMedidorAbreviado = m.getCodigo_medidor().split(" ")[1] + m.getCodigo_medidor().split(" ")[2];
codMedidor.setText(codMedidorAbreviado);
}
switch (m.getLecturaStatus()){
case "S/L":
obsLectMedidor.setBackgroundColor(Color.RED);
break;
case "OBS":
obsLectMedidor.setBackgroundColor(Color.YELLOW);
break;
case "OK":
obsLectMedidor.setBackgroundColor(Color.GREEN);
break;
default:
obsLectMedidor.setBackgroundColor(Color.GRAY);
break;
}
}
TextView ubicacionMedidor = convertView.findViewById(R.id.ubicacionMedidorSelecc);
return convertView;
}
private String seleccionarColor(){
Integer ran_num=0;
Random ran = new Random();
Boolean new_ran = false;
while(new_ran == false){
ran_num = ran.nextInt(50);
Log.i("RAN",ran_num.toString());
Boolean yaSeleccionado = false;
if(colores_seleccionados.size() < 50) {
for (int i = 0; i < colores_seleccionados.size(); i++) {
if (colores_seleccionados.get(i) == ran_num) {
Log.i("COLORS", "Color seleccionado ya existe en posición " + ran_num.toString());
yaSeleccionado = true;
break;
}
}
new_ran = !yaSeleccionado;
} else { //Ya fueron todos los colores disponibles seleccionados, ahora sólo debe asegurarse que no elija el mismo color que la ubicación anterior
if(ran_num != colores_seleccionados.get(colores_seleccionados.size()-1)){
new_ran = true;
}
}
}
colores_seleccionados.add(ran_num);
Log.i("RAN_COLOR",colores_tabla[ran_num]);
return colores_tabla[ran_num];
}
}
在我的活动中,我有以下与ListView相关的行 - 适配器:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/codigo_medidor"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="0.15"
android:layout_marginBottom="0dp"
android:layout_marginTop="0dp"
android:textSize="14sp" />
<TextView
android:id="@+id/nombre_medidor"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="0.7"
android:layout_marginBottom="0dp"
android:layout_marginTop="0dp"
android:textSize="14sp"/>
<TextView
android:id="@+id/estado_lects_medidor"
android:layout_height="wrap_content"
android:layout_width="0dp"
android:layout_weight="0.15"
android:layout_marginBottom="0dp"
android:layout_marginTop="0dp"
android:textSize="14sp"/>
</LinearLayout>
其中ListaMedidoresAdapter adapter = new ListaMedidoresAdapter(this,arregloMedidores,this);
listaMedidores.setAdapter(adapter);
的类型为arregloMedidores
。
为什么我没有选择ArrayList<Medidor>
?因为在我看来,附加到像Array这样的动态数据源更难,而且它占用更多资源,因为它将所有视图保存在内存中,这可能是1000个条目的问题。
提前谢谢。
答案 0 :(得分:1)
尝试添加行: 机器人:背景=&#34; @可绘制/ medidor_background&#34; 到您的fila_medidor.xml LinearLayout
然后在drawable文件夹中创建一个新的medidor_background.xml文件,其中包含内容:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_selected="true"
>
<shape>
<solid
android:color="#000000"
/>
</shape>
</item>
<item>
<shape>
<solid
android:color="#FFFFFF"
/>
</shape>
</item>
</selector>