从JSON

时间:2016-06-01 11:23:54

标签: android json android-recyclerview

我已经在我的应用程序中实现了recyclerview,现在我需要从API中获取数据,但我找不到如何做到这一点的好例子。这是我第一次尝试从API获取数据而我真的不知道该怎么做。

API以这种方式传递数据:

{
    status: "OK"
    code: 0
    message: ""
    results: [
    {
    id: 0
    slug: "data"
    slug_franquicia: "data"
    slug_categoria: "data"
  }}

在这里你可以看到我的构造函数(我现在使用带有6个字段的构造函数来显示静态数据,我想要使用的构造函数是解析数据的最大构造函数):

int id;
String slug;
String slug_franquicia;
String slug_categoria;
private String Franquicia;//nombre_franquicia
private String Modalidad;//nombre_categoria
private String nombre;
private String DescripcionC;
String contenido;
String oferta_ahorro;
int latitud;
int longitud;
String direccion;
String foto_negocio;//url
String foto_principal;//url
String horario;
String web;//url
String telefono;
String email;
String facebook;//url
String twitter;//url
String youtube;//url
String instagram;//url
String vimeo;//url
String googleplus;//url
String wordpress_autor;
String plan;
String estado;
String update_date;
String record_date;
private boolean Premium;//este no
private int imagen;//este no

public Empresas(int id, String slug,String slug_franquicia,String slug_categoria,String Franquicia,String Modalidad,String nombre, String DescripcionC,
                String contenido, String oferta_ahorro, int latitud, int longitud, String direccion, String foto_negocio, String foto_principal, String horario,
                String web, String telefono, String email, String facebook, String twitter, String youtube, String instagram, String vimeo, String googleplus,
                String wordpress_autor, String plan, String estado, String update_date, String record_date){
    this.id=id;
    this.slug=slug;
    this.slug_franquicia=slug_franquicia;
    this.slug_categoria=slug_categoria;
    this.Franquicia=Franquicia;
    this.Modalidad=Modalidad;
    this.nombre=nombre;
    this.DescripcionC=DescripcionC;
    this.contenido=contenido;
    this.oferta_ahorro=oferta_ahorro;
    this.latitud=latitud;
    this.longitud=longitud;
    this.direccion=direccion;
    this.foto_negocio=foto_negocio;
    this.foto_principal=foto_principal;
    this.horario=horario;
    this.web=web;
    this.telefono=telefono;
    this.email=email;
    this.facebook=facebook;
    this.twitter=twitter;
    this.youtube=youtube;
    this.instagram=instagram;
    this.vimeo=vimeo;
    this.googleplus=googleplus;
    this.wordpress_autor=wordpress_autor;
    this.plan=plan;
    this.estado=estado;
    this.update_date=update_date;
    this.record_date=record_date;

}




public Empresas(int imagen, String nombre, String DescripcionC, String Modalidad, String Franquicia, boolean Premium) {
    this.imagen = imagen;
    this.nombre = nombre;
    this.DescripcionC = DescripcionC;
    this.Modalidad = Modalidad;
    this.Franquicia = Franquicia;
    this.Premium = Premium;
}

这里我用静态信息填充列表:

public class Empresas2 {
private static Empresas[] empresas={
        new Empresas(R.drawable.activatuocio, "Activa tu ocio y di capacitados","Asociación sin ánimo de lucro que llena con ocio y talleres de formación en distintos ámbitos el tiempo de las personas con discapacidad intelectual. Confianza en si mismas, autonomía e integración.","Social", "El Ejido", true),
new Empresas(R.drawable.agroservicios, "Agroservicios Manuel Garzón","Todo tipo de trabajos de tractor con la mejor máquina, los aperos más completos y la mayor maestría en la conducción y profesionalidad para que el rendimiento de los cultivos vaya a mucho más.","Agricultura", "El Ejido", true ),
new Empresas(R.drawable.alexgarcia, "Alex García", "Alex García: Cantautor Almeriense. Disfruta de su nuevo disco titulado ''Por amor al arte, hasta que se harten.''","Artistas", "El Ejido", true ),
new Empresas(R.drawable.allianz, "Allianz Seguros Jorge Berenguer","Trato personalizado en la gestión de dos grandes marcas como Allianz y sus seguros de particulares y empresas para autónomos, pymes y grandes firmas, y Solunion y sus seguros de crédito y recobro.", "Legal", "El Ejido", false),
new Empresas(R.drawable.alteco, "Alteco", "Alteco Electricidad y Electrónica", "Profesionales", "El Ejido", true),
new Empresas(R.drawable.aluminiosmanuel, "Aluminios Manuel Estévez", "Grandes profesionales, las primeras marcas del mercado, las innovaciones que aparecen en el sector, todo congregado en una empresa que se ha ganado su prestigio a base de clientes satisfechos.", "Profesionales", "Vícar", true),
new Empresas(R.drawable.amalgama, "Amalgama Centro Musical", "Conocimiento, profesionalidad y un trato exclusivo es lo que nos diferencia en Amalgama, nuestra vida es la música, y eso transmitimos.", "Educación", "El Ejido", true),};



public static List<Empresas> getEmpresas() {
    return Arrays.asList(empresas);
}


public static Empresas getCourseByPosition(int position) {
    return empresas[position];
}

这是我在recyclerview中使用的适配器:

public class EmpresasAdapter extends RecyclerView.Adapter<EmpresasAdapter.EmpresasViewHolder>
    implements ItemClickListener{

private final Context context;
private List<Empresas> items;

public EmpresasAdapter(Context context, List<Empresas> items) {
    this.context = context;
    this.items = items;
}

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

@Override
public EmpresasViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext())
            .inflate(R.layout.empresa_card, viewGroup, false);
    return new EmpresasViewHolder(v, this);
}

@Override
public void onBindViewHolder(EmpresasViewHolder viewHolder, int i) {
    // Item procesado actualmente
    Empresas currentItem = items.get(i);

    viewHolder.nombrep.setText(currentItem.getNombre());
    viewHolder.franquiciap.setText(currentItem.getModalidad()+" | "+currentItem.getFranquicia());
   // Cargar imagen
    Glide.with(context)
            .load(currentItem.getImagen())
            .into(viewHolder.imagenp);
}

@Override
public void onItemClick(View view, int position) {
    // Imagen a compartir entre transiciones
   /* View sharedImage = view.findViewById(R.id.imagenp);
    EmpresaDetalle.launch(
            (Activity) context, position, sharedImage);*/

    Empresas currentItem = items.get(position);
    String nombre=currentItem.getNombre();
    String descripcion=currentItem.getDescripcionC();
    String franquicia=currentItem.getFranquicia();
    int imagen = currentItem.getImagen();
    View sharedImage = view.findViewById(R.id.imagenp);
    Intent intent = new Intent(context, EmpresaDetalle.class);
    intent.putExtra("nombre", nombre);
    intent.putExtra("descripcion", descripcion);
    intent.putExtra("franquicia", franquicia);
    intent.putExtra("imagen",imagen);
    context.startActivity(intent);
}

/**
 * View holder para reciclar elementos
 */
public static class EmpresasViewHolder extends RecyclerView.ViewHolder
        implements View.OnClickListener {
    // Views para un curso
    public ImageView imagenp;
    public TextView nombrep;

    public TextView franquiciap;
    // Interfaz de comunicación
    public ItemClickListener listener;

    public EmpresasViewHolder(View v, ItemClickListener listener) {
        super(v);
        nombrep = (TextView) v.findViewById(R.id.nombrep);

        franquiciap = (TextView) v.findViewById(R.id.Franquiciap);


        imagenp = (ImageView) v.findViewById(R.id.imagenp);
        v.setOnClickListener(this);

        this.listener = listener;
    }

    @Override
    public void onClick(View v) {
        listener.onItemClick(v, getAdapterPosition());
    }


}}

interface ItemClickListener {
void onItemClick(View view, int position);}

1 个答案:

答案 0 :(得分:2)

您可以使用Google Gson

使用此库,您只需要创建具有相同json结构的模型。然后自动填写模型。您必须将变量作为json键调用,或者如果要使用不同的名称,则使用@SerializedName。

对于你的例子:

JSON:

{
    status: "OK"
    code: 0
    message: ""
    results: [
       {
           id: 0
           slug: "data"
           slug_franquicia: "data"
           slug_categoria: "data"
       }
}

型号:

class MyModel {

    private String status;
    private int code;
    private String message;
    private ArrayList<MySubModel> results = new ArrayList<>();
}

class MySubModel {

    private int id;
    private String slug;
    private String slug_franquicia;

    @SerializedName("slug_categoria") // <- example SerializedName
    private String slugCategoria;
}

现在您可以使用Gson库进行解析:

MyModel model = gson.fromJson(jsonString, MyModel.class);