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

Galera, boa noite.

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

[code]<?xml version="1.0" encoding="utf-8"?>

<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" />

[/code]

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!

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.

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!

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.

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

[code] 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;
}[/code]

Retorno logcat

[quote]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)
[/quote]

Agradeço desde já pela ajuda!

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.

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

[code]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);
}

}[/code]

ListaPedidoProduto

[code] 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;
}[/code]

Mas ao tentar rodar tenho o seguinte retorno no logcat:

[quote]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)
[/quote]

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

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!