GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Estou estudando pelo livro Android da Casa do Código e travei


#1

Obrigado pela atenção
Estou estudando pelo livro Android da Casa do Código e travei na criação da progressBar com esse erro:

10-09 08:14:53.581: E/AndroidRuntime(301): FATAL EXCEPTION: main
10-09 08:14:53.581: E/AndroidRuntime(301): java.lang.IllegalStateException: android.widget.ProgressBar is not a view that can be bounds by this SimpleAdapter
10-09 08:14:53.581: E/AndroidRuntime(301): at android.widget.SimpleAdapter.bindView(SimpleAdapter.java:195)
10-09 08:14:53.581: E/AndroidRuntime(301): at android.widget.SimpleAdapter.createViewFromResource(SimpleAdapter.java:126)
10-09 08:14:53.581: E/AndroidRuntime(301): at android.widget.SimpleAdapter.getView(SimpleAdapter.java:114)
10-09 08:14:53.581: E/AndroidRuntime(301): at android.widget.AbsListView.obtainView(AbsListView.java:1315)
10-09 08:14:53.581: E/AndroidRuntime(301): at android.widget.ListView.makeAndAddView(ListView.java:1727)
10-09 08:14:53.581: E/AndroidRuntime(301): at android.widget.ListView.fillDown(ListView.java:652)
10-09 08:14:53.581: E/AndroidRuntime(301): at android.widget.ListView.fillFromTop(ListView.java:709)

Esta é a ActivityLlistViagem

package br.com.casadocodigo.boaviagem;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ProgressBar;
import android.widget.SimpleAdapter;
import android.widget.SimpleAdapter.ViewBinder;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.TextView;
public class ViagemListActivity extends ListActivity implements OnItemClickListener,
														OnClickListener, ViewBinder {
	private List<Map<String, Object>> viagens;
	private AlertDialog alertDialog;
	private AlertDialog dialogConfirmacao;
	private int viagemSelecionada;
	@Override
	protected void onCreate(Bundle savedInstanceState){
		super.onCreate(savedInstanceState);
		String[] de = {"imagem","destino","data","total", "barraProgresso"};
		int[] para = {R.id.tipoViagem, R.id.destino, R.id.data, R.id.valor, R.id.barraProgresso};
		SimpleAdapter adapter = new SimpleAdapter(this, listarViagens(), R.layout.lista_viagem, de, para); 
		setListAdapter(adapter);
		getListView().setOnItemClickListener(this);
		ListView listView = getListView();
		listView.setOnItemClickListener(this);
		this.alertDialog =  criarAlertDialog();
		this.dialogConfirmacao = criaDialogConfirmacao();
	}
	private List<Map<String, Object>> listarViagens(){
		viagens = new ArrayList<Map<String, Object>>();
		Map<String, Object> item = new HashMap<String, Object>();
		item.put("imagem", R.drawable.negocios);
		item.put("destino", "São Paulo");
		item.put("data", "02/02/2012 a 04/02/2012");
		item.put("total", "Gasto total R$ 314,98");
		item.put("barraProgresso", new Double[]{500.0, 450.0, 314.98});
		viagens.add(item);
		item = new HashMap<String, Object>();
		item.put("imagem", R.drawable.lazer);
		item.put("destino", "Maceió");
		item.put("data","14/05/2012 a 22/05/2012");
		item.put("total","Gasto total R$ 25834,67");
		item.put("barraProgresso2", new Double[]{500.0, 450.0, 314.98});
		viagens.add(item);
		return viagens;
	}
	public void onItemClick(AdapterView<?> parente, View view, int position, long id){
		this.viagemSelecionada  = position;
		alertDialog.show();
//		Map<String, Object> map = viagens.get(position);
//		String destino = (String) map.get("destino");
//		String mensagem = "Viagem selecionada" + destino;
//		Toast.makeText(getApplicationContext(), mensagem, Toast.LENGTH_SHORT).show();
//		startActivity(new Intent(this, GastoListActivity.class));
	}
	@Override
	public void onClick(DialogInterface dialog, int item){
		switch (item) {
		case 0:
			startActivity(new Intent(this, ViagemActivity.class));
			break;
		case 1:
			startActivity(new Intent(this, GastoActivity.class));
			break;
		case 2:
			startActivity(new Intent(this, GastoListActivity.class));
			break;
		case 3:
			dialogConfirmacao.show();
			break;
		case DialogInterface.BUTTON_POSITIVE:
			viagens.remove(viagemSelecionada);
			getListView().invalidateViews();
			break;
		case DialogInterface.BUTTON_NEGATIVE:
			dialogConfirmacao.dismiss();
			break;
		default:
			break;
		}
	}
	private AlertDialog criarAlertDialog(){
		final CharSequence[] items = {
				getString(R.string.editar),
				getString(R.string.novo_gasto),
				getString(R.string.gastos_realizados),
				getString(R.string.remover)};
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle(R.string.opcoes);
		builder.setItems(items, this);		
		return builder.create();
	}
	private AlertDialog criaDialogConfirmacao(){
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setMessage(R.string.confirmacao_exclusao_viagem);
		builder.setPositiveButton(getString(R.string.sim), this);
		builder.setNegativeButton(R.string.nao, this);
		return builder.create();
	}
	@Override
	public boolean setViewValue(View view, Object data, String textRepresentation){
		if(view.getId() == R.id.barraProgresso){
			Double valores[] = (Double[]) data;
			ProgressBar progressBar = (ProgressBar) view;
			progressBar.setMax(valores[0].intValue());
			progressBar.setSecondaryProgress(valores[1].intValue());
			progressBar.setProgress(valores[2].intValue());
			return true;
		}
		return false;
	}
}

Este é a lista_viagem.xml, de onde estou pegando o layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical" >
        <ImageView
            android:id="@+id/tipoViagem"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_marginLeft="10dp"
        android:orientation="vertical" >
        <TextView
            android:id="@+id/destino"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
            android:id="@+id/data"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <TextView
            android:id="@+id/valor"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <ProgressBar
            android:id="@+id/barraProgresso"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            style="@android:attr/progressBarStyleHorizontal" />
    </LinearLayout>
</LinearLayout>

#2

Opa cara, beleza, como que tá?

Velho estou acompanhando esse livro e estou com o mesmo problema. Conseguiu resolver?


#3

Tente criar um adapter que retorne a view correta.

Nessa solução voce irá precisar criar o bind na implementação.


#4

Olá

 adapter.setViewBinder(this);

#5

Valeu pessoal, deu certo. Fiz da seguinte forma, se tiverem alguma contra-indicação será ótimo saber. ^^

Dentro do onCreate, fiz o seuinte:

@Override
				public boolean setViewValue(View view, Object data,	String textRepresentation) {
					if (view.getId() == R.id.barraProgresso) {
						Double valores[] = (Double[]) data;
						ProgressBar progressBar = (ProgressBar) view;
						progressBar.setMax(valores[0].intValue());
						progressBar.setSecondaryProgress(valores[1].intValue());
						progressBar.setProgress(valores[2].intValue());
						return true;
					}
					return false;
				}
			});

#6

Vocês que estão estudando por esse livro, o que acham dele? Está valendo a pena?


#7

Iae cara, como que tá?

Cara to gostando. É bem técnico mas aborda bastante teoria também. Vale a pena.


#8

Valeu pela resposta amigo, vou fazer esse pequeno investimento :wink:


#9

É bom, mas é mais indicado para quem já tenha um conhecimento básico do Android.


#10

Onde eu consigo esse conhecimento básico de Android, já estou a um tempinho tentando achar um material bom sobre fundamentos de Android.


#11

Cara não se engane, não precisa de conhecimento básico em android já que o PRÓPRIO LIVRO TE ENSINA ANDROID. O única coisa que é necessária para fazer um bom uso do livro é conhecer do básico para intermediário de java, e também conhecer Orientação a Objetos. Caso você tenha esses dois atributos, pode comprar o livro que vale a pena.


#12

Se você acha que umas 120 páginas (que é a parte básica, incluindo instalação, o livro tem +300 páginas) sejam suficientes para entender o Android, tudo bem. O que eu acho é que o livro vai ser mais útil para quem já tenha um certo perfil, já que não é muito detalhado.
Se você já tiver experiência em orientação a objetos, sql, design patterns, programação orientado a eventos, estrutura de dados, etc, aí tudo bem.
O livro é bom, mas, isso não significa que vai ser proveitoso para todo mundo, da mesma maneira!


#13

Então cara cobrir tudo ou quase tudo é impossível né. Mas o livro te ensina o suficiente pra depois você se virar com o google. Eu mesmo estou tendo meu primeiro contato com android por ele, e estou achando bem proveitoso, claro que as vezes fica algumas dúvidas no ar, mas nada que uma boa e velha googlada não resolva. Quanto aos itens que você mencionou concordo que o fato de eu ter conhecimento prévio deles me ajudou um pouco, mas o SQLite que é o banco que o livro aborda, faz quase tudo pra você. Então tendo uma noção bem básica de SQL ou banco de dados já resolve. Quanto ao design patterns acho meio desnecessário o conhecimento prévio, tendo em vista que os patterns que o livro aborda são os mais simples, e explica direitinho para que eles servem.

Resumindo. Ao meu ver a única coisa realmente importante para saber antes de começar a leitura, é Orientação a Objetos e java, de resto acho que não interfere tanto.


#14

Os livros do Lecheta são bons, o do Reto Meier (inglês) e o site Android Developer.
É bom ter acesso a mais de uma fonte para não ficar restrito a uma única abordagem.
Esse da Casa do Código é bom por ter uma abordagem interessante para o desenvolvimento de um app com a implementação de várias funcionalidades.

Abraço


#15

Estou estudando pelo livro do João Bosco da Casa do Código, tô gostando do livro, mas alguém aí sabe onde eu consigo as imagens usadas no projeto Boa Viagem?


#16

Cara, não entendi o que vc fez...
Vc criou o setViewValue() dentro do método onCreate()?
Pelo menos no meu Eclipse não dá pra criar um método dentro do outro.
Foi isso mesmo que vc fez?
VC poderia postar o código todo?
To com o mesmo problema, alguém pode me ajudar?


#17

Encontrei uma solução...

Eu inclui uma sub-classe no final do código com um ViewBinder

	private class ViagemViewBinder implements ViewBinder {
		public boolean setViewValue(View view, Object data,
				String textRepresentation) {
			if (view.getId() == R.id.barraProgresso) {
				Double valores[] = (Double[]) data;
				ProgressBar progressBar = (ProgressBar) view;
				progressBar.setMax(valores[0].intValue());
				progressBar.setSecondaryProgress(valores[1].intValue());
				progressBar.setProgress(valores[2].intValue());
				return true;
			}
			return false;
		}
	}

E dentro do método onCreate() eu inclui o seguinte:

adapter.setViewBinder(new ViagemViewBinder());

#18

Boa tarde!
Lorkshem, fiz da maneira que vocês postou acima...
Porém, recebi o seguinte erro:

03-24 13:36:11.427: E/AndroidRuntime(1444): java.lang.NullPointerException
03-24 13:36:11.427: E/AndroidRuntime(1444): at br.com.casadocodigo.boaviagem.ViagemListActivity$ViagemViewBinder.setViewValue(ViagemListActivity.java:140)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.widget.SimpleAdapter.bindView(SimpleAdapter.java:168)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.widget.SimpleAdapter.createViewFromResource(SimpleAdapter.java:126)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.widget.SimpleAdapter.getView(SimpleAdapter.java:114)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.widget.AbsListView.obtainView(AbsListView.java:2263)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.widget.ListView.makeAndAddView(ListView.java:1790)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.widget.ListView.fillDown(ListView.java:691)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.widget.ListView.fillFromTop(ListView.java:752)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.widget.ListView.layoutChildren(ListView.java:1630)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.widget.AbsListView.onLayout(AbsListView.java:2091)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.view.View.layout(View.java:14817)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.view.ViewGroup.layout(ViewGroup.java:4631)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.view.View.layout(View.java:14817)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.view.ViewGroup.layout(ViewGroup.java:4631)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.view.View.layout(View.java:14817)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.view.ViewGroup.layout(ViewGroup.java:4631)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.view.View.layout(View.java:14817)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.view.ViewGroup.layout(ViewGroup.java:4631)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1987)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1744)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.view.Choreographer.doCallbacks(Choreographer.java:574)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.view.Choreographer.doFrame(Choreographer.java:544)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.os.Handler.handleCallback(Handler.java:733)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.os.Handler.dispatchMessage(Handler.java:95)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.os.Looper.loop(Looper.java:136)
03-24 13:36:11.427: E/AndroidRuntime(1444): at android.app.ActivityThread.main(ActivityThread.java:5017)
03-24 13:36:11.427: E/AndroidRuntime(1444): at java.lang.reflect.Method.invokeNative(Native Method)
03-24 13:36:11.427: E/AndroidRuntime(1444): at java.lang.reflect.Method.invoke(Method.java:515)
03-24 13:36:11.427: E/AndroidRuntime(1444): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
03-24 13:36:11.427: E/AndroidRuntime(1444): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
03-24 13:36:11.427: E/AndroidRuntime(1444): at dalvik.system.NativeStart.main(Native Method)

Será que alguém pode me ajudar, por favor?!

package br.com.casadocodigo.boaviagem;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.AlertDialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.SimpleAdapter;
import android.widget.SimpleAdapter.ViewBinder;
import android.widget.TextView;
import android.widget.Toast;
public class ViagemListActivity extends ListActivity implements OnItemClickListener, OnClickListener {
	private List<Map<String, Object>> viagens;
	private AlertDialog alertDialog;
	private int viagemSelecionada;
	private AlertDialog dialogConfirmacao;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		String[] de = {"imagem", "destino", "data", "total", "barraProgresso"};
		int[] para = {R.id.tipoViagem, R.id.destino, R.id.data, R.id.valor, R.id.barraProgresso};
		SimpleAdapter adapter =	new SimpleAdapter(this, listarViagens(), R.layout.lista_viagem, de, para);
		setListAdapter(adapter);
		getListView().setOnItemClickListener(this);
		this.alertDialog = criaAlertDialog();
		this.alertDialog = criaAlertDialog();
		this.dialogConfirmacao = criaDialogConfirmacao();
		adapter.setViewBinder(new ViagemViewBinder()); 
	}
	private List<Map<String, Object>> listarViagens() {
		viagens = new ArrayList<Map<String,Object>>();
		Map<String, Object> 
		item = new HashMap<String, Object>();
		item.put("imagem", R.drawable.negocio);
		item.put("destino", "São Paulo");
		item.put("data","02/02/2012 a 04/02/2012");
		item.put("total","Gasto total R$ 314,98");
		item.put("barraProgresso", new Double[]{ 500.0, 450.0, 314.98});
		viagens.add(item);
		item = new HashMap<String, Object>();
		item.put("imagem", R.drawable.lazer);
		item.put("destino", "Maceió");
		item.put("data","14/05/2012 a 22/05/2012");
		item.put("total","Gasto total R$ 25834,67");
		viagens.add(item);
		return viagens;
	}
	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
		//Map<String, Object> map = viagens.get(position);
		//String destino = (String) map.get("destino");
		//String mensagem = "Viagem selecionada: "+ destino;
		//Toast.makeText(this, mensagem, Toast.LENGTH_SHORT).show();
		//startActivity(new Intent(this, GastoListActivity.class));
		this.viagemSelecionada = position;
		alertDialog.show();
	}
	@Override
	public void onClick(DialogInterface dialog, int item) {
		switch (item) {
			case 0:
				startActivity(new Intent(this, ViagemActivity.class));
				break;
			case 1:
				startActivity(new Intent(this, GastoActivity.class));
				break;
			case 2:
				startActivity(new Intent(this, GastoListActivity.class));
				break;
			case 3:
				dialogConfirmacao.show();
				break;
				case DialogInterface.BUTTON_POSITIVE:
					viagens.remove(viagemSelecionada);
					getListView().invalidateViews();
					break;
				case DialogInterface.BUTTON_NEGATIVE:
					dialogConfirmacao.dismiss();
					break;
			}
	}
	private AlertDialog criaAlertDialog() {
		final CharSequence[] items = {
				getString(R.string.editar),
				getString(R.string.novo_gasto),
				getString(R.string.gastos_realizados),
				getString(R.string.remover) };
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setTitle(R.string.opcoes);
		builder.setItems(items, this);
		return builder.create();
	}
	private AlertDialog criaDialogConfirmacao() {
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setMessage(R.string.confirmacao_exclusao_viagem);
		builder.setPositiveButton(getString(R.string.sim), this);
		builder.setNegativeButton(getString(R.string.nao), this);
		return builder.create();
	}
	private class ViagemViewBinder implements ViewBinder {  
	    public boolean setViewValue(View view, Object data, String textRepresentation) {  
	        if (view.getId() == R.id.barraProgresso) {  
	            Double valores[] = (Double[]) data;  
	            ProgressBar progressBar = (ProgressBar) view;  
	            progressBar.setMax(valores[0].intValue());  
	            progressBar.setSecondaryProgress(valores[1].intValue());  
	            progressBar.setProgress(valores[2].intValue());  
	            return true;  
	        }  
	        return false;  
	    }  
	}  
}

E aqui o xml...

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >
    <LinearLayout
		android:layout_width="wrap_content"
		android:layout_height="match_parent"
		android:gravity="center"
		android:orientation="vertical" >
		<ImageView
			android:id="@+id/tipoViagem"
			android:layout_width="wrap_content"
			android:layout_height="wrap_content" />
	</LinearLayout>
    <LinearLayout
		android:layout_width="wrap_content"
		android:layout_height="match_parent"
		android:layout_marginLeft="10dp"
		android:orientation="vertical" >
			<TextView
				android:id="@+id/destino"
				android:layout_width="wrap_content"
				android:layout_height="wrap_content" />
			<TextView
				android:id="@+id/data"
				android:layout_width="wrap_content"
				android:layout_height="wrap_content" />
			<TextView
				android:id="@+id/valor"
				android:layout_width="wrap_content"
				android:layout_height="wrap_content" />
			<ProgressBar android:id="@+id/barraProgresso"
				android:layout_width="fill_parent"
				android:layout_height="wrap_content"
				style="?android:attr/progressBarStyleHorizontal"/>
	</LinearLayout>
</LinearLayout>

#19

Meu caro, você introduziu mais o que , que deu certo? Não entendi =S


#20

O livro é bom ?