import java.io.Serializable

Propaganda
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>
Download