FACULDADE DE TECNOLOGIA SENAC PELOTAS Curso Superior de Tecnologia em Análise e Desenvolvimento de Sistemas Tópicos Avançados em ADS – Edécio Fernando Iepsen -------------------------------------------- Livro.java package br.com.edecio.consultajsonnovatec; import java.io.Serializable; public class Livro implements Serializable { public String titulo; public String categoria; public String autor; public int ano; public int paginas; public String capa; public Livro() { } public Livro(String titulo, String categoria, String autor, int ano, int paginas, String capa) { this.titulo = titulo; this.categoria = categoria; this.autor = autor; this.ano = ano; this.paginas = paginas; this.capa = capa; } @Override public String toString() { return titulo; } } --------------------------------------------- LivroHttp.java package br.com.edecio.consultajsonnovatec; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import import import import import import import java.io.ByteArrayOutputStream; java.io.IOException; java.io.InputStream; java.net.HttpURLConnection; java.net.URL; java.util.ArrayList; java.util.List; public class LivroHttp { public static final String LIVROS_URL_JSON = "http://10.0.2.2/ws/novatec.json"; // "https://raw.githubusercontent.com/nglauber/"+ // "dominando_android/master/livros_novatec.json"; private static HttpURLConnection connectar(String urlArquivo) throws IOException { final int SEGUNDOS = 1000; URL url = new URL(urlArquivo); HttpURLConnection conexao = (HttpURLConnection)url.openConnection(); conexao.setReadTimeout(10 * SEGUNDOS); conexao.setConnectTimeout(15 * SEGUNDOS); conexao.setRequestMethod("GET"); conexao.setDoInput(true); conexao.setDoOutput(false); conexao.connect(); return conexao; } public static boolean temConexao(Context ctx) { ConnectivityManager cm = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = cm.getActiveNetworkInfo(); return (info != null && info.isConnected()); } public static List<Livro> carregarLivrosJson() { try { HttpURLConnection conexao = connectar(LIVROS_URL_JSON); int resposta = conexao.getResponseCode(); if (resposta == HttpURLConnection.HTTP_OK) { InputStream is = conexao.getInputStream(); JSONObject json = new JSONObject(bytesParaString(is)); return lerJsonLivros(json); } } catch (Exception e) { e.printStackTrace(); } return null; } public static List<Livro> lerJsonLivros(JSONObject json) throws JSONException { List<Livro> listaDeLivros = new ArrayList<Livro>(); String categoriaAtual; JSONArray jsonNovatec = json.getJSONArray("novatec"); for (int i = 0; i < jsonNovatec.length(); i++) { JSONObject jsonCategoria = jsonNovatec.getJSONObject(i); categoriaAtual = jsonCategoria.getString("categoria"); JSONArray jsonLivros = jsonCategoria.getJSONArray("livros"); for (int j = 0; j < jsonLivros.length(); j++) { JSONObject jsonLivro = jsonLivros.getJSONObject(j); Livro livro = new Livro( jsonLivro.getString("titulo"), categoriaAtual, jsonLivro.getString("autor"), jsonLivro.getInt("ano"), jsonLivro.getInt("paginas"), jsonLivro.getString("capa") ); listaDeLivros.add(livro); } } return listaDeLivros; } private static String bytesParaString(InputStream is) throws IOException { byte[] buffer = new byte[1024]; // O bufferzao vai armazenar todos os bytes lidos ByteArrayOutputStream bufferzao = new ByteArrayOutputStream(); // precisamos saber quantos bytes foram lidos int bytesLidos; // Vamos lendo de 1KB por vez... while ((bytesLidos = is.read(buffer)) != -1) { // copiando a quantidade de bytes lidos do buffer para o bufferzão bufferzao.write(buffer, 0, bytesLidos); } return new String(bufferzao.toByteArray(), "UTF-8"); } } --------------------------------------------- LivrosListAdapter.java package br.com.edecio.consultajsonnovatec; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.TextView; import com.squareup.picasso.Picasso; import java.util.List; public class LivrosListAdapter extends ArrayAdapter<Livro>{ public LivrosListAdapter(Context context, List<Livro> objects) { super(context, 0, objects); } @Override public View getView(int position, View convertView, ViewGroup parent) { Livro livro = getItem(position); ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(getContext()).inflate( R.layout.item_livro_list, null); holder = new ViewHolder(); holder.imgCapa = (ImageView)convertView.findViewById(R.id.imgCapa); holder.txtTitulo = (TextView)convertView.findViewById(R.id.txtTitulo); holder.txtAutores = (TextView)convertView.findViewById(R.id.txtAutores); holder.txtPaginas = (TextView)convertView.findViewById(R.id.txtPaginas); holder.txtAno = (TextView)convertView.findViewById(R.id.txtAno); convertView.setTag(holder); } else { holder = (ViewHolder)convertView.getTag(); } Picasso.with(getContext()).load(livro.capa).into(holder.imgCapa); holder.txtTitulo.setText(livro.titulo); holder.txtAutores.setText(livro.autor); holder.txtAno.setText(String.valueOf(livro.ano)); holder.txtPaginas.setText(getContext().getString(R.string.n_paginas, livro. paginas)); return convertView; } static class ViewHolder { ImageView imgCapa; TextView txtTitulo; TextView txtAutores; TextView txtPaginas; TextView txtAno; } } -------------------------------------------------- LivrosListFragment package br.com.edecio.consultajsonnovatec; import import import import import import import import import import android.app.Fragment; android.os.AsyncTask; android.os.Bundle; android.view.LayoutInflater; android.view.View; android.view.ViewGroup; android.widget.ArrayAdapter; android.widget.ListView; android.widget.ProgressBar; android.widget.TextView; import java.util.ArrayList; import java.util.List; public class LivrosListFragment extends Fragment { LivrosTask mTask; List<Livro> mLivros; ListView mListView; TextView mTextMensagem; ProgressBar mProgressBar; ArrayAdapter<Livro> mAdapter; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View layout = inflater.inflate(R.layout.fragment_livros_list, null); mTextMensagem = (TextView)layout.findViewById(android.R.id.empty); mProgressBar = (ProgressBar)layout.findViewById(R.id.progressBar); mListView = (ListView)layout.findViewById(R.id.list); mListView.setEmptyView(mTextMensagem); return layout; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); if (mLivros == null) { mLivros = new ArrayList<Livro>(); } mAdapter = new LivrosListAdapter(getActivity(), mLivros); // mAdapter = new ArrayAdapter<Livro>(getActivity(), android.R.layout.simple_list_item_1, mLivros); mListView.setAdapter(mAdapter); if (mTask == null) { if (LivroHttp.temConexao(getActivity())) { iniciarDownload(); } else { mTextMensagem.setText("Sem conexão"); } } else if (mTask.getStatus() == AsyncTask.Status.RUNNING) { exibirProgress(true); } } private void exibirProgress(boolean exibir) { if (exibir) { mTextMensagem.setText("Baixando informações dos livros..."); } mTextMensagem.setVisibility(exibir ? View.VISIBLE : View.GONE); mProgressBar.setVisibility(exibir ? View.VISIBLE : View.GONE); } public void iniciarDownload() { if (mTask == null || mTask.getStatus() != AsyncTask.Status.RUNNING) { mTask = new LivrosTask(); mTask.execute(); } } class LivrosTask extends AsyncTask<Void, Void, List<Livro>>{ @Override protected void onPreExecute() { super.onPreExecute(); exibirProgress(true); } @Override protected List<Livro> doInBackground(Void... strings) { return LivroHttp.carregarLivrosJson(); } @Override protected void onPostExecute(List<Livro> livros) { super.onPostExecute(livros); exibirProgress(false); if (livros != null) { mLivros.clear(); mLivros.addAll(livros); mAdapter.notifyDataSetChanged(); } else { mTextMensagem.setText("Falha ao obter livros"); } } } } ----------------------------------------------- MainActivity.java package br.com.edecio.consultajsonnovatec; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } ==================================== activity_main.xml <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:layout_width="match_parent" android:layout_height="match_parent" android:name="br.com.edecio.consultajsonnovatec.LivrosListFragment" android:id="@+id/listFragment"/> </FrameLayout> ================================== fragment_livros_list.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center"> <ProgressBar style="?android:attr/progressBarStyleLarge" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/progressBar" android:layout_centerInParent="true" android:visibility="gone"/> <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/list" /> <TextView android:id="@android:id/empty" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_below="@+id/progressBar"/> </RelativeLayout> ===================================================== item_livro_list.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:padding="6dp"> <ImageView android:layout_width="60dp" android:layout_height="80dp" android:id="@+id/imgCapa" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" android:layout_marginRight="8dp" android:layout_alignParentTop="true" android:layout_marginTop="8dp"/> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:text="@null" android:id="@+id/txtTitulo" android:layout_alignTop="@+id/imgCapa" android:layout_toRightOf="@+id/imgCapa" android:layout_toEndOf="@+id/imgCapa"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@null" android:id="@+id/txtAutores" android:layout_below="@+id/txtTitulo" android:layout_toRightOf="@+id/imgCapa" android:layout_toEndOf="@+id/imgCapa" android:textStyle="italic"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:text="@null" android:id="@+id/txtAno" android:layout_below="@+id/txtAutores" android:layout_alignParentRight="true" android:layout_alignParentEnd="true"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:text="@null" android:id="@+id/txtPaginas" android:layout_below="@+id/txtAutores" android:layout_toRightOf="@+id/imgCapa" android:layout_toEndOf="@+id/imgCapa"/> </RelativeLayout> -------------------------------------------- res/layout/strings.xml <string name="n_paginas">%d páginas</string>