【问题标题】:Accessing members of items in a JSON Array in recyclerview在recyclerview中访问JSON数组中的项目成员
【发布时间】:2019-12-08 19:05:34
【问题描述】:

你好,你能帮我解决我 5 天前遇到的问题吗 我得到了所有涉及的 json 集合,但只有 json 格式,但我只想得到一些属性,比如 json_array alumnos_involucrados 集合的 nombre_alumnos

小米 JSON 响应

[
        {
            "id": 1,
            "fecha_creacion": "2019-11-19 03:05:47",
            "observacion": "observación 1",
            "profesor_nombre": "Profesor1",
            "profesor_apellido": "Profesor1",
            "falta": "Acoso",
            "lugar": "Aula 1",
            "grado": "3",
            "seccion": "A",
            "alumnos_involucrados": [
                {
                    "id_alumno": 1,
                    "nombre_alumno": "Ariana",
                    "ape_paterno": "Verástegui",
                    "ape_materno": "Pedraza"
                },
                {
                    "id_alumno": 4,
                    "nombre_alumno": "Alvaro",
                    "ape_paterno": "Castañeda",
                    "ape_materno": "Losio"
                },
                {
                    "id_alumno": 5,
                    "nombre_alumno": "Sebas",
                    "ape_paterno": "Mendez",
                    "ape_materno": "Cotera"
                }
            ]
        }
    ]

----------------------------------------------- ----------------------------------

适配器回收视图

   public class AdapterReportes  extends RecyclerView.Adapter<AdapterReportes.ViewHolderReportes> implements View.OnClickListener {
        Dialog myDialog;

    Context context;


    private List<Incidencias> listaincidencias;
    private View.OnClickListener listener;
    private ListView listviewa;

    public AdapterReportes() {
        this.listaincidencias =new ArrayList<>();
    }


    public void setListaincidencias(List<Incidencias> listaincidencias) {
        this.listaincidencias = listaincidencias;
    }


    @Override
    public ViewHolderReportes onCreateViewHolder(@NonNull ViewGroup viewGroup, final int i) {
        View view= LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_list,null,false);

        view.setOnClickListener(this);
        final ViewHolderReportes vHolder=new ViewHolderReportes(view);
        context=view.getContext();
        myDialog=new Dialog(context);
        myDialog.setContentView(R.layout.fragment_detalle_incidencia);
        vHolder.item_reportes.setOnClickListener(new View.OnClickListener() {

                public void onClick(View view) {

                TextView textSeccion=(TextView)myDialog.findViewById(R.id.idSeccionReporte);
                TextView textHora=(TextView)myDialog.findViewById(R.id.idFechaReporte);
                TextView textGrado=(TextView)myDialog.findViewById(R.id.idGradoReporte);
                TextView textTipo=(TextView)myDialog.findViewById(R.id.idTipoReporte);
                TextView textLugar=(TextView)myDialog.findViewById(R.id.idLugarReporte);
                TextView textDescripcion=(TextView)myDialog.findViewById(R.id.DescripcionIncidencia) ;
                TextView textAlumnos=(TextView)myDialog.findViewById(R.id.idNombreAlumnoReporte);
                textTipo.setText(listaincidencias.get(vHolder.getAdapterPosition()).getFalta());
                textSeccion.setText(listaincidencias.get(vHolder.getAdapterPosition()).getSeccion());
                textGrado.setText(listaincidencias.get(vHolder.getAdapterPosition()).getGrado());
                textHora.setText(listaincidencias.get(vHolder.getAdapterPosition()).getFechaCreacion());
                textAlumnos.setText(listaincidencias.get(vHolder.getAdapterPosition()).getAlumnosInvolucrados().toString());
                textLugar.setText(listaincidencias.get(vHolder.getAdapterPosition()).getLugar());
                textDescripcion.setText(listaincidencias.get(vHolder.getAdapterPosition()).getObservacion());
                myDialog.show();
                Window window = myDialog.getWindow();
                window.setLayout(Toolbar.LayoutParams.FILL_PARENT, ActionBar.LayoutParams.WRAP_CONTENT);

                Toast.makeText(context,"Text Click"+String.valueOf(vHolder.getAdapterPosition()),Toast.LENGTH_SHORT).show();
            }
        });
                 return vHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolderReportes holder, int i) {
        holder.Codigo.setText(String.valueOf(listaincidencias.get(i).getId()));
        holder.hora.setText(listaincidencias.get(i).getFechaCreacion());



    }

    @Override
    public int getItemCount() {

        return listaincidencias.size();

    }

    public void setOnClickListener(View.OnClickListener listener){
        this.listener=listener;

    }

    @Override
    public void onClick(View view) {
        if(listener!=null){
            listener.onClick(view);
        }

    }

    public class ViewHolderReportes extends RecyclerView.ViewHolder {
        private LinearLayout item_reportes;

        TextView Codigo,hora;
        public ViewHolderReportes(@NonNull View itemView) {

            super(itemView);
            item_reportes=(LinearLayout) itemView.findViewById(R.id.VistaReporte);
            hora=itemView.findViewById(R.id.idHoraIncidencia);
            Codigo=itemView.findViewById(R.id.idReporte);



        }


    }
}

【问题讨论】:

  • 请阅读“如何创建minimal reproducible example”。然后使用edit 链接改进您的问题(不要通过 cmets 添加更多信息)。否则我们无法回答您的问题并为您提供帮助。您确实发布了 很多 代码,但我不明白您的问题到底是什么?!

标签: java android arrays json retrofit2


【解决方案1】:

以下 2 个解决方案展示了如何实现您想要的。

解决方案 1

使用JspnPath 并编写表达式来检索所需字段的值。

Maven 依赖

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.4.0</version>
</dependency>

代码sn-p

DocumentContext jsonContext = JsonPath.parse(jsonStr);
Object obj = jsonContext.read("$[0].alumnos_involucrados[1].nombre_alumno");
System.out.println(obj.toString()); //Alvaro

解决方案 2

使用 Jackson 等 JSON 库将响应 JSON 字符串反序列化为 POJO。

代码sn-p

@JsonIgnoreProperties(ignoreUnknown = true)
class MyResponse {
    @JsonProperty("alumnos_involucrados")
    List<AlumnosInvolucrado> alumnosInvolucrados;

    //general getters ans setters
}

@JsonIgnoreProperties(ignoreUnknown = true)
class AlumnosInvolucrado {
    @JsonProperty("nombre_alumno")
    private String nombreAlumno;

    //general getters and setters
}

ObjectMapper mapper = new ObjectMapper();
List<MyResponse> myResponse = mapper.readValue(jsonStr, new 
TypeReference<List<MyResponse>>(){});
System.out.println(myResponse.get(0).getAlumnosInvolucrados().get(1).getNombreAlumno()); //Alvaro

【讨论】:

    【解决方案2】:

    您可以使用 POJO 类来获取 Objects 中的数据

    import java.util.List;
    
    public class DataModel {
    
    private List<Alumnos_involucrados> alumnos_involucrados;
    private String seccion;
    private String grado;
    private String lugar;
    private String falta;
    private String profesor_apellido;
    private String profesor_nombre;
    private String observacion;
    private String fecha_creacion;
    private int id;
    
    public List<Alumnos_involucrados> getAlumnos_involucrados() {
        return alumnos_involucrados;
    }
    
    public String getSeccion() {
        return seccion;
    }
    
    public String getGrado() {
        return grado;
    }
    
    public String getLugar() {
        return lugar;
    }
    
    public String getFalta() {
        return falta;
    }
    
    public String getProfesor_apellido() {
        return profesor_apellido;
    }
    
    public String getProfesor_nombre() {
        return profesor_nombre;
    }
    
    public String getObservacion() {
        return observacion;
    }
    
    public String getFecha_creacion() {
        return fecha_creacion;
    }
    
    public int getId() {
        return id;
    }
    
    public static class Alumnos_involucrados {
        private String ape_materno;
        private String ape_paterno;
        private String nombre_alumno;
        private int id_alumno;
    
        public String getApe_materno() {
            return ape_materno;
        }
    
        public String getApe_paterno() {
            return ape_paterno;
        }
    
        public String getNombre_alumno() {
            return nombre_alumno;
        }
    
        public int getId_alumno() {
            return id_alumno;
        }
     }
    }
    

    使用这个类,您可以使用 Retrofit 或您喜欢的库从您的 API 获取数据 我将展示使用改造的示例

    这是改造界面

    @GET('api_link' //api link endPoint here)
    Call<DataModel> getData(//pass parameters here);
    

    在enqueue 中获取您的数据

    DataModel myData = response.body();
    //you can get any field using this
    String seccion = myData.getSeccion();
    String ape_materno = myData.getAlumnos_involucrados().get(position).getApe_materno();
    //use this in adapter or anywhere
    

    Reference to learn Retrofit

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-06
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 2017-09-19
      • 1970-01-01
      • 2016-02-04
      相关资源
      最近更新 更多