|
Página 1 de 1
|
[ 1 Mensagem ] |
|
[TUTO]Conexão bi-direcional, Activity-Service - Parte 2 List
| Autor |
Mensagem |
|
A H Gusukuma
Dalvik Virtual Machine
Data de registro: 17 Jul 2011, 10:55 Mensagens: 2023 Localização: São Paulo
|
 [TUTO]Conexão bi-direcional, Activity-Service - Parte 2 List
Usando a base do TUTO viewtopic.php?f=7&t=16448 vamos agora incluir uma ListView, usando uma LinkedList para guardar os locations recebidos do service. Aproveitando a oportunidade, vamos também mostrar um Adapter customizado. 1. Começamos criando um novo arquivo de layout, com o nome de linhalista.xml Vamos mover o último LinearLayout do main.xml anterior. Ele deve ficar assim: <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TableRow > <TextView android:text="TextView" android:id="@+id/textView1" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> <TextView android:text="TextView" android:id="@+id/textView2" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> </TableRow> <TableRow > <TextView android:text="TextView" android:id="@+id/textView3" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> <TextView android:text="TextView" android:id="@+id/textView4" android:layout_weight="1" android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView> </TableRow> </TableLayout>
2. Vamos alterar o main.xml anterior da seguinte maneira: retiramos o último LinearLayout e acrescentamos o ListView. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:weightSum="1"> <TextView android:id="@+id/status" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:text=""/>
<LinearLayout android:orientation="horizontal" android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="wrap_content"> <Button android:layout_width="wrap_content" android:id="@+id/start_alarm" android:layout_weight="1" android:text="Start" android:layout_height="wrap_content"></Button> <Button android:layout_width="wrap_content" android:id="@+id/stop_alarm" android:layout_weight="1" android:text="Stop" android:layout_height="wrap_content"></Button> </LinearLayout>
<View android:layout_height="2dip" android:layout_width="fill_parent" android:background="#ff909090" />
<ListView android:id="@+id/listView1" android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_weight="1"> </ListView> </LinearLayout>
3. Vamos acrescentar uma nova classe extendendo o BaseAdapter com o nome de MyListAdapter. Notem que no construtor da classe temos a referência ao contexto e à lista das Locations. Setamos a lista e usamos o contexto para termos acesso ao serviço do LayoutInflater. Usamos aqui o layout linhalista. Vejam que só criamos uma nova view se não existir uma anterior. Notem que no método getView temos os set´s dos textViews que estavam na Activity. package br. com. agorandroid; import java. text. SimpleDateFormat; import java. util. Date; import java. util. LinkedList; import android. content. Context; import android. location. Location; import android. view. LayoutInflater; import android. view. View; import android. view. ViewGroup; import android. widget. BaseAdapter; import android. widget. TextView; public class MyListAdapter extends BaseAdapter { private LinkedList<Location> lista = new LinkedList<Location> (); private LayoutInflater inflater; private final SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); public MyListAdapter (Context context, LinkedList<Location> lista ){ this. lista = lista; inflater = (LayoutInflater ) context. getSystemService(Context. LAYOUT_INFLATER_SERVICE); } @Override public int getCount () { return lista. size(); } @Override public Object getItem (int position ) { return lista. get(position ); } @Override public long getItemId (int position ) { return position; } @Override public View getView (int position, View convertView, ViewGroup parent ) { View view; if (convertView == null) { view = inflater. inflate(R. layout. linhalista, null); } else { view = convertView; } Location l = lista. get(position ); if (lista. size() > 0) { TextView tv1 = (TextView ) view. findViewById(R. id. textView1); tv1. setText("Lat: " + (double) l. getLatitude()); TextView tv2 = (TextView ) view. findViewById(R. id. textView2); tv2. setText("Long: " + (double) l. getLongitude()); TextView tv3 = (TextView ) view. findViewById(R. id. textView3); tv3. setText(sdf. format(new Date(l. getTime()))); TextView tv4 = (TextView ) view. findViewById(R. id. textView4); tv4. setText(l. getProvider()+ " "+l. getAccuracy()); } return view; } } 4. Finalmente, vamos alterar a Activity. Vamos incluir as linhas abaixo, com as variáveis do MyListAdapter, da ListView e da LinkedList e uma constante para controlar o tamanho máximo da lista. final private int MAX_LISTVIEW = 30; private MyListAdapter listAdapter; private ListView listView; private LinkedList<Location> filaUltimosLocations = new LinkedList<Location> (); Vamos incluir as linhas abaixo, onde acessamos a referência do ListView e instanciamos o MylistAdapter passando o contexto e a lista. A última linha seta o adapter do listView. listView = (ListView) findViewById (R. id. listView1); listAdapter = new MyListAdapter (this, filaUltimosLocations ); listView. setAdapter(listAdapter ); Vamos alterar o nome da rotina de atualizaTela para atualizaLista. Notem que no atualizaLista estamos controlando o número máximo de itens na lista. Quando chegar ao limite, removemos o primeiro elemento da fila. Os novos locations são incluídos no final. Ao final informamos ao adapter que a lista sofreu uma alteração. public void onNewLocation(Location location) { atualizaLista(location); }
private void atualizaLista(Location location) {
if (filaUltimosLocations.size()>=MAX_LISTVIEW) { filaUltimosLocations.removeFirst(); } filaUltimosLocations.addLast(location); listAdapter.notifyDataSetChanged(); }
Segue o código da Activity: package br. com. agorandroid; import java. util. LinkedList; import br. com. agorandroid. TesteGPS_xxService. LocalBinder; import android. app. Activity; import android. content. ComponentName; import android. content. Context; import android. content. Intent; import android. content. ServiceConnection; import android. location. Location; import android. os. Bundle; import android. os. IBinder; import android. view. View; import android. view. View. OnClickListener; import android. widget. Button; import android. widget. ListView; import android. widget. TextView; /** * @author A H Gusukuma * agorandroid.blogspot.com */public class TesteGPS_xxActivity extends Activity { final private int MAX_LISTVIEW = 30; private MyListAdapter listAdapter; private ListView listView; private LinkedList<Location> filaUltimosLocations = new LinkedList<Location> (); private TesteGPS_xxService mService; boolean mBound = false; private TextView tv; /** Called when the activity is first created. */ @Override public void onCreate (Bundle savedInstanceState ) { super. onCreate(savedInstanceState ); setContentView (R. layout. main); Button button = (Button)findViewById (R. id. start_alarm); button. setOnClickListener(mStartListener ); button = (Button)findViewById (R. id. stop_alarm); button. setOnClickListener(mStopListener ); tv = (TextView ) findViewById (R. id. status); listView = (ListView) findViewById (R. id. listView1); listAdapter = new MyListAdapter (this, filaUltimosLocations ); listView. setAdapter(listAdapter ); } @Override protected void onStart () { super. onStart(); Intent intent = new Intent (this, TesteGPS_xxService. class); bindService (intent, mConnection, Context. BIND_AUTO_CREATE); } @Override public void onPause () { super. onPause(); tv. setText(""); if (mBound ) { mService. stopColeta(); } } @Override protected void onStop () { super. onStop(); if (mBound ) { unbindService (mConnection ); mBound = false; } } private OnClickListener mStartListener = new OnClickListener () { public void onClick (View v ) { if (mBound ) { tv. setText("Coleta iniciada"); mService. startColeta(); } } }; private OnClickListener mStopListener = new OnClickListener () { public void onClick (View v ) { if (mBound ) { tv. setText("Coleta finalizada"); mService. stopColeta(); } } }; private ServiceConnection mConnection = new ServiceConnection () { @Override public void onServiceConnected (ComponentName className, IBinder service ) { LocalBinder binder = (LocalBinder ) service; mService = binder. getService(); mService. setOnLocListener(new OnLocListener () { @Override public void onNewLocation (Location location ) { atualizaLista (location ); } }); mBound = true; } @Override public void onServiceDisconnected (ComponentName className ) { tv. setText("Coleta finalizada"); mBound = false; } }; private void atualizaLista (Location location ) { if (filaUltimosLocations. size()>=MAX_LISTVIEW ) { filaUltimosLocations. removeFirst(); } filaUltimosLocations. addLast(location ); listAdapter. notifyDataSetChanged(); }} A interface OnLocListener, o manifest e o service TesteGPS_xxService não sofreram alterações, não estão listados aqui. É só testar e ver a listView sendo populada com os Locations. Para quem reproduziu o projeto, testem a seguinte alteração: private void atualizaLista(Location location) {
if (filaUltimosLocations.size()>=MAX_LISTVIEW) { filaUltimosLocations.removeLast(); } filaUltimosLocations.addFirst(location); listAdapter.notifyDataSetChanged(); }
Bons códigos!
_________________Abraços ___________ Novo App: CalcMat - Calculadora de materiais para concreto Blog: Agorandroid - sobre programação Android Twitter: @Agorandroid ___________ Campanha: Facilite sua vida e a dos outros usuários Netiqueta:Procure responder as sugestões. Quando encontrar a solução, coloque [Resolvido] no primeiro post o mais rápido possível. Lembre-se de agradecer às pessoas que ajudaram e poste a solução do problema.
|
| 26 Jan 2012, 10:31 |
|
|
|
Página 1 de 1
|
[ 1 Mensagem ] |
|
Quem está online |
Usuários vendo este fórum: Abraao, abruzzi, adautox, adilson.afl, alex, Alexandre Castro, alexandrefett, alexandreizumi, andi, andrewort, andrigo, Androidthebest, b7web, beeshop, berchielli, bernardodauer, betofigu, bigr ecreio, BOMBER27, bomcabelo, BrunoO, C-3PO, carlos rodrigues, Cassius, celiapinheiro, cezaraf, chunga, cleber, Cleiton, Comandante Cody, compto, Cristranus, dalmeidabr, danielbfranco, danilosv, dariosena, Darth Maul, deborazb, Diego Otani, Eduardo, eloilton, eluttner, erissi, erosvaldo, estratecnologia, everaldo, eXagon, fabrizior, FelipeOliveira, Flavio Alves, flaviojps, Flávio Robertgo, fraga, gedoor, geovanebg, Gomes, Google Desktop, Gooooogle, Governador Wilhuff Tarkin, Guilherme, guitarro17, henrique.cardoso, humberto, icarodavi, Ielo8, ismaels, jackstuard, jacquesbica, JAndroid, jcorreajr, Jenius, jgfelix, jijo, joaquimfoto, JuniorE, juniorfranca, lalaine, lucianno, Machado000, MarceloMC, marcosandreao, Marini, Marlus Dias Silva, mateusff, memnoch, mlemos, monteirojp, mrkensley, MSPRAFAEL, nandokanarski, Newton Barbosa, nishimura.ichigo, nocivus, nsansilva, obitow, Odigooogle™, osternack, pedro, pemam.com.br, pererinha, pfsmorigo, pgbatera, phsantos, piagg, piantino, pilon, Portal Android, ramonsiebra, rcotonet, regeriob2br, regisjj, renan.fernandes, renatocoliveira, rerp7, Rickxdx, rlecheta, rmendes, Roll, rtodao, schiroky, SidneiCP, silvio.carlos, slackware, sobrinho, srmoreira, tavares767, tiagofalcao, Vector, woyzeck, xikin, Yoda e 5 visitantes |
|
Você não pode criar novos tópicos neste fórum Você não pode responder tópicos neste fórum Você não pode editar suas mensagens neste fórum Você não pode excluir suas mensagens neste fórum Você não pode enviar anexos neste fórum
|
|