当尝试以编程方式添加一个监听器添加到textview时,只有最后一个按预期工作

时间:2015-08-27 14:54:01

标签: android

在使用webservice之后,我得到了一个json对象,在解析之后我需要创建一个textview(对于每个元素)并且每个对象都添加一个监听器。 目前所有TEXTVIEW都使用相同的ID(最后一个)进行绑定,因此它们都会传递相同的额外内容(在本例中为id_asignacion)

这里是添加文本视图并将其与侦听器绑定的代码:

    for (int i=0; i < jArray.length(); i++){
                try {
                    JSONObject oneObject = jArray.getJSONObject(i);
                    descripcion = oneObject.getString("descripcion");
                    direccion = oneObject.getString("direccion");
                    id_denuncia = oneObject.getString("idDenuncia");
                    TextView nueva_asignacion = new TextView(ctx);
                    ImageView separador = new ImageView(ctx);
                    separador.setImageResource(R.drawable.barrablanca);
                    nueva_asignacion.setTextColor(getResources().getColor(R.color.gris_claro));
                    nueva_asignacion.setTextSize(getResources().getDimension(R.dimen.dpde10));
                    if(int_color == 0){
                        nueva_asignacion.setBackgroundColor(getResources().getColor(R.color.blanco));
                        int_color = 1;
                    }else{
                        nueva_asignacion.setBackgroundColor(getResources().getColor(R.color.gris_perfil));
                        int_color = 0;
                    }
                    nueva_asignacion.setText(descripcion + ".\nEn: " + direccion);
                    linearLayout_asignaciones.addView(nueva_asignacion);
                    nueva_asignacion.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View v) {
                            abrir_detalle_asignacion(id_denuncia);
                        }
                        });

                    linearLayout_asignaciones.addView(separador);

                } catch (JSONException e) {
                    e.printStackTrace();
                }

            }

我将它们绑定到(abrir_detalle_asignacion)的函数如下:

    public void abrir_detalle_asignacion(String id_denuncia) {
        Intent intent = new Intent(ctx, DetalleAsignacion.class);
        intent.putExtra("RUT", RutLog);
        intent.putExtra("id_inspector", id_inspector);
        intent.putExtra("id_asignacion", id_denuncia);
        startActivityForResult(intent, 0);
        overridePendingTransition(R.anim.from_middle, R.anim.to_middle);
    }

TL DR:每个Textview都与SAME id_denuncia绑定,因此所有Textviews都做同样的事情。

2 个答案:

答案 0 :(得分:2)

我认为你有一个id_denuncia的问题,因为你在每次迭代时覆盖它的值,并且每次点击都会实际传递最后一个值,这就是为什么只有最后一个TextView按预期工作

例如,有几种解决方案 通过索引从json传递字符串,类似于 -

abrir_detalle_asignacion(jArray.getJSONObject(i).getString("idDenuncia"));

OR

可能将值存储在数组中,并通过索引将数组中的值传递给方法:

abrir_detalle_asignacion(id_denuncia_array[i]);

答案 1 :(得分:0)

您可以声明自己的班级

class MyOnClick implements View.OnClickListener {
    private final String id;
    MyOnClick(String s) {
        id = new String(s);
    }
    public void onClick(View v) {
        abrir_detalle_asignacion(id);
    }
}

并使用它:nueva_asignacion.setOnClickListener(new MyOnClick(id_denuncia))