如何选择ListView行并突出显示它(几个TextViews)?

时间:2017-12-12 20:10:59

标签: android listview

我有一个['cl1', 'cl2', 'cl3'] ,其中每行有三个TextView,显示有关名为Medidor(Meter)的对象的信息。

我的问题是:当onClick事件发生时,如何将整行标记为已选中?如果选择,我只需要使当前行颜色变暗,否则返回正常。

我考虑在包含对象的列表上使用setOnItemClickListener(我ListViewArrayList<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个条目的问题。

提前谢谢。

1 个答案:

答案 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>