[Resolvido] Listadapter com botão no rodapé da tela

7 respostas
Z

Galera, boa noite.

Seguindo o artigo ([url]http://romarconsultoria.blogspot.com.br/2011/03/criando-um-listadapter-customizado-para.html[/url]) fiz um listview customizado:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="#cccccc"
    android:padding="5dp" >

    <TextView
        android:id="@+id/txtProduto"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:paddingLeft="5dp"
        android:text="X-Bacon"
        android:textColor="#333333"
        android:textSize="20sp" />


    <Button
        android:id="@+id/btnExcluirPedidoProduto"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/txtProduto"
        android:text="@string/btnExcluirProduto" />

    <TextView
        android:id="@+id/txtValor"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/txtProduto"
        android:text="Valor: 10,00"
        android:textColor="#333333" />

</RelativeLayout>

Preenchi ele com os valores do meu SQLite e maravilha, tudo certo.
Contudo, eu gostaria de adicionar no rodapé dessa tela um único botão para o usuário finalizar o pedido selecionado.
Adicionei o botão na codificação acima, mas ele repete o botão em cada linha do listview.

Gostaria de saber como devo proceder para realizar isso.

Agradeço desde já pela ajuda!

7 Respostas

ibotirama

Zenity, isso acontece porque o layout que você está usando é um layout da linha do view, para funcionar do jeito que você espera, teria que mudar o esquema da sua tela, ao invés de um ListActivity, poderia ser um activity e criar a list como componente no Layout da Activity.

O restante você de certa forma aproveitaria.

Z

Amigo, obrigado pela resposta!
Eu até entendi o que você quis dizer, mas como sou novo no Android não estou conseguindo implementar aqui.
Dei uma vasculhada na internet e achei esse link e vi que o camarada faz o que você me falou.
Estou tentando implementar aqui, mas estou com duas dúvidas.

1 - O que eu passo no setContentView? O layout da listview??
2 - No exemplo, para ele inserir no adapter ele usa a classe AdapterListView, só que ao tentar importa-la para meu projeto não há encontro. Existe algum motivo para isso?

Agradeço desde já pela sua atenção!

Z

Amigo, já vi aqui.
Falta de atenção minha na hora de ler a codificação do camarada :roll:

A classe AdapterListView é a minha classe que gera os itens da list, agora só fica a questão do que eu devo passar no setcontentview.

Z

Amigo, cheguei na seguinte codificação, mas não obtive sucesso.

FinalizarPedido.java
public class FinalizarPedido extends Activity {
	ListView listView;
	
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
        setContentView(R.layout.listview_pedidoproduto);
        createListView();
	}
	
	@SuppressWarnings("unchecked")
	public void createListView() {
		List<PedidoProduto> lista = new ArrayList<PedidoProduto>();

		if (getIntent().hasExtra("lista")) {
			lista = (ArrayList<PedidoProduto>) getIntent().getExtras().getSerializable("lista");
		}
		
		ListaPedidoProduto lPedProd = new ListaPedidoProduto(this, lista);
		listView.setAdapter(lPedProd);
	}
}
ListaPedidoProduto.java
public View getView(int position, View converView, ViewGroup oarent) {
		final PedidoProduto pedidoProduto = (PedidoProduto) getItem(position);
		
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.listview_pedidoproduto, null);
        
        TextView txtNomeProduto = (TextView)view.findViewById(R.id.txtProduto);
        txtNomeProduto.setText(pedidoProduto.getNomeProduto());

        TextView txtValorProduto = (TextView)view.findViewById(R.id.txtValor);
        txtValorProduto.setText("Valor: " + String.valueOf(pedidoProduto.getValor()));
        
        Button btnExcluir = (Button) view.findViewById(R.id.btnExcluirPedidoProduto);
        
        btnExcluir.setOnClickListener(new View.OnClickListener() {
			public void onClick(View v) {
				PedidoProdutoDAO db = new PedidoProdutoDAO(context);
				db.excluir(pedidoProduto);
			}
		});
        
        return view;
	}

Retorno logcat

11-09 23:55:10.380: I/Process(4966): Sending signal. PID: 4966 SIG: 9
11-09 23:55:11.330: D/CLIPBOARD(5122): Hide Clipboard dialog at Starting input: finished by someone else... !
11-09 23:55:12.315: D/AndroidRuntime(5122): Shutting down VM
11-09 23:55:12.315: W/dalvikvm(5122): threadid=1: thread exiting with uncaught exception (group=0x40c4f1f8)
11-09 23:55:12.330: E/AndroidRuntime(5122): FATAL EXCEPTION: main
11-09 23:55:12.330: E/AndroidRuntime(5122): java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.unip.menudroid/br.com.unip.menudroid.FinalizarPedido}: java.lang.NullPointerException
11-09 23:55:12.330: E/AndroidRuntime(5122): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1970)
11-09 23:55:12.330: E/AndroidRuntime(5122): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995)
11-09 23:55:12.330: E/AndroidRuntime(5122): at android.app.ActivityThread.access$600(ActivityThread.java:128)
11-09 23:55:12.330: E/AndroidRuntime(5122): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161)
11-09 23:55:12.330: E/AndroidRuntime(5122): at android.os.Handler.dispatchMessage(Handler.java:99)
11-09 23:55:12.330: E/AndroidRuntime(5122): at android.os.Looper.loop(Looper.java:137)
11-09 23:55:12.330: E/AndroidRuntime(5122): at android.app.ActivityThread.main(ActivityThread.java:4517)
11-09 23:55:12.330: E/AndroidRuntime(5122): at java.lang.reflect.Method.invokeNative(Native Method)
11-09 23:55:12.330: E/AndroidRuntime(5122): at java.lang.reflect.Method.invoke(Method.java:511)
11-09 23:55:12.330: E/AndroidRuntime(5122): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
11-09 23:55:12.330: E/AndroidRuntime(5122): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
11-09 23:55:12.330: E/AndroidRuntime(5122): at dalvik.system.NativeStart.main(Native Method)
11-09 23:55:12.330: E/AndroidRuntime(5122): Caused by: java.lang.NullPointerException
11-09 23:55:12.330: E/AndroidRuntime(5122): at br.com.unip.menudroid.FinalizarPedido.createListView(FinalizarPedido.java:29)
11-09 23:55:12.330: E/AndroidRuntime(5122): at br.com.unip.menudroid.FinalizarPedido.onCreate(FinalizarPedido.java:17)
11-09 23:55:12.330: E/AndroidRuntime(5122): at android.app.Activity.performCreate(Activity.java:4533)
11-09 23:55:12.330: E/AndroidRuntime(5122): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053)
11-09 23:55:12.330: E/AndroidRuntime(5122): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934)
11-09 23:55:12.330: E/AndroidRuntime(5122): ... 11 more
11-09 23:55:12.340: D/dalvikvm(5122): GC_CONCURRENT freed 176K, 4% free 14031K/14535K, paused 1ms+2ms
11-09 23:55:12.345: E/SQLiteDatabase(5122): close() was never explicitly called on database '/data/data/br.com.unip.menudroid/databases/menuDroid'
11-09 23:55:12.345: E/SQLiteDatabase(5122): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
11-09 23:55:12.345: E/SQLiteDatabase(5122): at android.database.sqlite.SQLiteDatabase.(SQLiteDatabase.java:2063)
11-09 23:55:12.345: E/SQLiteDatabase(5122): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1117)
11-09 23:55:12.345: E/SQLiteDatabase(5122): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1074)
11-09 23:55:12.345: E/SQLiteDatabase(5122): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1161)
11-09 23:55:12.345: E/SQLiteDatabase(5122): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:869)
11-09 23:55:12.345: E/SQLiteDatabase(5122): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:228)
11-09 23:55:12.345: E/SQLiteDatabase(5122): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157)
11-09 23:55:12.345: E/SQLiteDatabase(5122): at br.com.unip.menudroid.database.PedidoProdutoDAO.(PedidoProdutoDAO.java:19)
11-09 23:55:12.345: E/SQLiteDatabase(5122): at br.com.unip.menudroid.Main$3.onClick(Main.java:51)
11-09 23:55:12.345: E/SQLiteDatabase(5122): at android.view.View.performClick(View.java:3644)
11-09 23:55:12.345: E/SQLiteDatabase(5122): at android.view.View$PerformClick.run(View.java:14313)
11-09 23:55:12.345: E/SQLiteDatabase(5122): at android.os.Handler.handleCallback(Handler.java:605)
11-09 23:55:12.345: E/SQLiteDatabase(5122): at android.os.Handler.dispatchMessage(Handler.java:92)
11-09 23:55:12.345: E/SQLiteDatabase(5122): at android.os.Looper.loop(Looper.java:137)
11-09 23:55:12.345: E/SQLiteDatabase(5122): at android.app.ActivityThread.main(ActivityThread.java:4517)
11-09 23:55:12.345: E/SQLiteDatabase(5122): at java.lang.reflect.Method.invokeNative(Native Method)
11-09 23:55:12.345: E/SQLiteDatabase(5122): at java.lang.reflect.Method.invoke(Method.java:511)
11-09 23:55:12.345: E/SQLiteDatabase(5122): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993)
11-09 23:55:12.345: E/SQLiteDatabase(5122): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760)
11-09 23:55:12.345: E/SQLiteDatabase(5122): at dalvik.system.NativeStart.main(Native Method)
11-09 23:55:12.345: E/System(5122): Uncaught exception thrown by finalizer
11-09 23:55:12.345: E/System(5122): java.lang.IllegalStateException: Don't have database lock!
11-09 23:55:12.345: E/System(5122): at android.database.sqlite.SQLiteDatabase.verifyLockOwner(SQLiteDatabase.java:2221)
11-09 23:55:12.345: E/System(5122): at android.database.sqlite.SQLiteDatabase$1.entryRemoved(SQLiteDatabase.java:2313)
11-09 23:55:12.345: E/System(5122): at android.database.sqlite.SQLiteDatabase$1.entryRemoved(SQLiteDatabase.java:2309)
11-09 23:55:12.345: E/System(5122): at android.util.LruCache.trimToSize(LruCache.java:197)
11-09 23:55:12.345: E/System(5122): at android.util.LruCache.evictAll(LruCache.java:285)
11-09 23:55:12.345: E/System(5122): at android.database.sqlite.SQLiteDatabase.deallocCachedSqlStatements(SQLiteDatabase.java:2274)
11-09 23:55:12.345: E/System(5122): at android.database.sqlite.SQLiteDatabase.closeClosable(SQLiteDatabase.java:1246)
11-09 23:55:12.345: E/System(5122): at android.database.sqlite.SQLiteDatabase.finalize(SQLiteDatabase.java:2034)
11-09 23:55:12.345: E/System(5122): at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:185)
11-09 23:55:12.345: E/System(5122): at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:168)
11-09 23:55:12.345: E/System(5122): at java.lang.Thread.run(Thread.java:856)

Agradeço desde já pela ajuda!

ibotirama

Só falta agora criar um layout para o seu Activity, não dá pra usar o mesmo, tem que ser um para o seu Activity e outro para o ListView(assim pode usar quantas vezes quizer, mas não vai dar o efeito que você espera).

Então no seu Layout para o Activity coloque um listView e um button em baixo.

Z

Então, eu fiz aqui.

Só que ainda não tive sucesso.
Li linha por linha do tutorial do camarada e fiz aqui, criei um xml para a tela principal e um para os itens.
E fiz a codificação da seguinte forma:

FinalizarPedido
public class FinalizarPedido extends Activity {
	private ListView listView;
	
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
        setContentView(R.layout.finalizar_produto);
        createListView();

        listView = (ListView) findViewById(R.layout.listview_pedidoproduto);
		createListView();
	}
	
	@SuppressWarnings("unchecked")
	public void createListView() {
		List<PedidoProduto> lista = new ArrayList<PedidoProduto>();

		if (getIntent().hasExtra("lista")) {
			lista = (ArrayList<PedidoProduto>) getIntent().getExtras().getSerializable("lista");
		}
		
		ListaPedidoProduto lPedProd = new ListaPedidoProduto(this, lista);
		listView.setAdapter(lPedProd);
	}
}
ListaPedidoProduto
public View getView(int position, View converView, ViewGroup oarent) {
		PedidoProduto pedidoProduto = (PedidoProduto) getItem(position);
        View view = inflater.inflate(R.layout.listview_pedidoproduto, null);
        
        TextView txtNomeProduto = (TextView)view.findViewById(R.id.txtProduto);
        txtNomeProduto.setText(pedidoProduto.getNomeProduto());

        TextView txtValorProduto = (TextView)view.findViewById(R.id.txtValor);
        txtValorProduto.setText("Valor: " + String.valueOf(pedidoProduto.getValor()));
        
        return view;
	}

Mas ao tentar rodar tenho o seguinte retorno no logcat:

11-10 00:23:40.725: D/AbsListView(7382): Get MotionRecognitionManager 11-10 00:23:40.725: D/AndroidRuntime(7382): Shutting down VM 11-10 00:23:40.725: W/dalvikvm(7382): threadid=1: thread exiting with uncaught exception (group=0x40c4f1f8) 11-10 00:23:40.735: E/AndroidRuntime(7382): FATAL EXCEPTION: main 11-10 00:23:40.735: E/AndroidRuntime(7382): java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.unip.menudroid/br.com.unip.menudroid.FinalizarPedido}: java.lang.NullPointerException 11-10 00:23:40.735: E/AndroidRuntime(7382): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1970) 11-10 00:23:40.735: E/AndroidRuntime(7382): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1995) 11-10 00:23:40.735: E/AndroidRuntime(7382): at android.app.ActivityThread.access$600(ActivityThread.java:128) 11-10 00:23:40.735: E/AndroidRuntime(7382): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1161) 11-10 00:23:40.735: E/AndroidRuntime(7382): at android.os.Handler.dispatchMessage(Handler.java:99) 11-10 00:23:40.735: E/AndroidRuntime(7382): at android.os.Looper.loop(Looper.java:137) 11-10 00:23:40.735: E/AndroidRuntime(7382): at android.app.ActivityThread.main(ActivityThread.java:4517) 11-10 00:23:40.735: E/AndroidRuntime(7382): at java.lang.reflect.Method.invokeNative(Native Method) 11-10 00:23:40.735: E/AndroidRuntime(7382): at java.lang.reflect.Method.invoke(Method.java:511) 11-10 00:23:40.735: E/AndroidRuntime(7382): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 11-10 00:23:40.735: E/AndroidRuntime(7382): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) 11-10 00:23:40.735: E/AndroidRuntime(7382): at dalvik.system.NativeStart.main(Native Method) 11-10 00:23:40.735: E/AndroidRuntime(7382): Caused by: java.lang.NullPointerException 11-10 00:23:40.735: E/AndroidRuntime(7382): at br.com.unip.menudroid.FinalizarPedido.createListView(FinalizarPedido.java:32) 11-10 00:23:40.735: E/AndroidRuntime(7382): at br.com.unip.menudroid.FinalizarPedido.onCreate(FinalizarPedido.java:17) 11-10 00:23:40.735: E/AndroidRuntime(7382): at android.app.Activity.performCreate(Activity.java:4533) 11-10 00:23:40.735: E/AndroidRuntime(7382): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1053) 11-10 00:23:40.735: E/AndroidRuntime(7382): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1934) 11-10 00:23:40.735: E/AndroidRuntime(7382): ... 11 more 11-10 00:23:40.745: D/dalvikvm(7382): GC_CONCURRENT freed 177K, 4% free 14038K/14535K, paused 2ms+2ms 11-10 00:23:40.750: E/SQLiteDatabase(7382): close() was never explicitly called on database '/data/data/br.com.unip.menudroid/databases/menuDroid' 11-10 00:23:40.750: E/SQLiteDatabase(7382): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here 11-10 00:23:40.750: E/SQLiteDatabase(7382): at android.database.sqlite.SQLiteDatabase.(SQLiteDatabase.java:2063) 11-10 00:23:40.750: E/SQLiteDatabase(7382): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1117) 11-10 00:23:40.750: E/SQLiteDatabase(7382): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1074) 11-10 00:23:40.750: E/SQLiteDatabase(7382): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1161) 11-10 00:23:40.750: E/SQLiteDatabase(7382): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:869) 11-10 00:23:40.750: E/SQLiteDatabase(7382): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:228) 11-10 00:23:40.750: E/SQLiteDatabase(7382): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:157) 11-10 00:23:40.750: E/SQLiteDatabase(7382): at br.com.unip.menudroid.database.PedidoProdutoDAO.(PedidoProdutoDAO.java:19) 11-10 00:23:40.750: E/SQLiteDatabase(7382): at br.com.unip.menudroid.Main$3.onClick(Main.java:51) 11-10 00:23:40.750: E/SQLiteDatabase(7382): at android.view.View.performClick(View.java:3644) 11-10 00:23:40.750: E/SQLiteDatabase(7382): at android.view.View$PerformClick.run(View.java:14313) 11-10 00:23:40.750: E/SQLiteDatabase(7382): at android.os.Handler.handleCallback(Handler.java:605) 11-10 00:23:40.750: E/SQLiteDatabase(7382): at android.os.Handler.dispatchMessage(Handler.java:92) 11-10 00:23:40.750: E/SQLiteDatabase(7382): at android.os.Looper.loop(Looper.java:137) 11-10 00:23:40.750: E/SQLiteDatabase(7382): at android.app.ActivityThread.main(ActivityThread.java:4517) 11-10 00:23:40.750: E/SQLiteDatabase(7382): at java.lang.reflect.Method.invokeNative(Native Method) 11-10 00:23:40.750: E/SQLiteDatabase(7382): at java.lang.reflect.Method.invoke(Method.java:511) 11-10 00:23:40.750: E/SQLiteDatabase(7382): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:993) 11-10 00:23:40.750: E/SQLiteDatabase(7382): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:760) 11-10 00:23:40.750: E/SQLiteDatabase(7382): at dalvik.system.NativeStart.main(Native Method) 11-10 00:23:40.750: E/System(7382): Uncaught exception thrown by finalizer 11-10 00:23:40.750: E/System(7382): java.lang.IllegalStateException: Don't have database lock! 11-10 00:23:40.750: E/System(7382): at android.database.sqlite.SQLiteDatabase.verifyLockOwner(SQLiteDatabase.java:2221) 11-10 00:23:40.750: E/System(7382): at android.database.sqlite.SQLiteDatabase$1.entryRemoved(SQLiteDatabase.java:2313) 11-10 00:23:40.750: E/System(7382): at android.database.sqlite.SQLiteDatabase$1.entryRemoved(SQLiteDatabase.java:2309) 11-10 00:23:40.750: E/System(7382): at android.util.LruCache.trimToSize(LruCache.java:197) 11-10 00:23:40.750: E/System(7382): at android.util.LruCache.evictAll(LruCache.java:285) 11-10 00:23:40.750: E/System(7382): at android.database.sqlite.SQLiteDatabase.deallocCachedSqlStatements(SQLiteDatabase.java:2274) 11-10 00:23:40.750: E/System(7382): at android.database.sqlite.SQLiteDatabase.closeClosable(SQLiteDatabase.java:1246) 11-10 00:23:40.750: E/System(7382): at android.database.sqlite.SQLiteDatabase.finalize(SQLiteDatabase.java:2034) 11-10 00:23:40.750: E/System(7382): at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:185) 11-10 00:23:40.750: E/System(7382): at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:168) 11-10 00:23:40.750: E/System(7382): at java.lang.Thread.run(Thread.java:856)

Saberia me dizer onde estou pisando na bola? :lol:

Z

Galera,

Após pisar muito em ovos vi onde eu estava fazendo errado.
Só explicando como tem que fazer para funcionar.

1 - Você precisa criar um layout com a listview.
2 - Você precisa criar um layout da row da listview.
3 - Feito isso, você criará um arquivo para chamar a tela onde tem a listview
4 - Agora você deverá instanciar a listview passando o layout da row.
5 - Pronto, vai funcionar :smiley:

O erro na minha codificação acima estava na linha

Não posso passar a tela, preciso passar o id da listview.

Valeu galera!

Criado 10 de novembro de 2012
Ultima resposta 10 de nov. de 2012
Respostas 7
Participantes 2