Slide 1

Slide 1 text

MATC89: Aplicações para Dispositivos Móveis Universidade Federal da Bahia (UFBA) Rodrigo Rocha e Christina von Flach 2012.2 ListView Android SDK

Slide 2

Slide 2 text

Tópicos 1. ListView e ArrayAdapter 2. Adapter Personalizado 3. Reuso de Células 4. Padrão Holder 5. Interação e ListActivity

Slide 3

Slide 3 text

ListView

Slide 4

Slide 4 text

ListView ListView

Slide 5

Slide 5 text

ListView ListView Rolagem!

Slide 6

Slide 6 text

ListView ListView Célula (layout) Rolagem!

Slide 7

Slide 7 text

ListAdapter

Slide 8

Slide 8 text

ListAdapter Modelo

Slide 9

Slide 9 text

ListAdapter Modelo ListAdapter ListView

Slide 10

Slide 10 text

Layout (.xml)

Slide 11

Slide 11 text

Layout (.xml) activity_main.xml

Slide 12

Slide 12 text

Activity (.java)

Slide 13

Slide 13 text

Activity (.java) MainActivity.java public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }

Slide 14

Slide 14 text

Activity (.java) MainActivity.java public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }

Slide 15

Slide 15 text

Activity (.java) MainActivity.java private ListView listView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }

Slide 16

Slide 16 text

Activity (.java) MainActivity.java private ListView listView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } } listView = (ListView)findViewById(R.id.listView);

Slide 17

Slide 17 text

ArrayAdapter MainActivity.java private ListView listView; public class MainActivity extends Activity { // ...

Slide 18

Slide 18 text

ArrayAdapter MainActivity.java private ListView listView; public class MainActivity extends Activity { // ... private ArrayAdapter listAdapter;

Slide 19

Slide 19 text

ArrayAdapter MainActivity.java private ListView listView; public class MainActivity extends Activity { private String[] contatos = {"João", "Zé", "Ana"}; // ... private ArrayAdapter listAdapter;

Slide 20

Slide 20 text

ArrayAdapter MainActivity.java private ListView listView; public class MainActivity extends Activity { private String[] contatos = {"João", "Zé", "Ana"}; // ... private ArrayAdapter listAdapter; modelo

Slide 21

Slide 21 text

ArrayAdapter

Slide 22

Slide 22 text

ArrayAdapter MainActivity.java protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } listView = (ListView)findViewById(R.id.listView);

Slide 23

Slide 23 text

ArrayAdapter MainActivity.java protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } listView = (ListView)findViewById(R.id.listView);

Slide 24

Slide 24 text

ArrayAdapter MainActivity.java protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } listView = (ListView)findViewById(R.id.listView); listAdapter = new ArrayAdapter( this, android.R.layout.simple_list_item_1, android.R.id.text1, contatos);

Slide 25

Slide 25 text

ArrayAdapter MainActivity.java protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } listView = (ListView)findViewById(R.id.listView); listAdapter = new ArrayAdapter( this, android.R.layout.simple_list_item_1, android.R.id.text1, contatos); layout da célula

Slide 26

Slide 26 text

ArrayAdapter MainActivity.java protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } listView = (ListView)findViewById(R.id.listView); listAdapter = new ArrayAdapter( this, android.R.layout.simple_list_item_1, android.R.id.text1, contatos); layout da célula id do TextView

Slide 27

Slide 27 text

ArrayAdapter MainActivity.java protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } listView = (ListView)findViewById(R.id.listView); listAdapter = new ArrayAdapter( this, android.R.layout.simple_list_item_1, android.R.id.text1, contatos); layout da célula id do TextView modelo

Slide 28

Slide 28 text

ArrayAdapter MainActivity.java protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } listView = (ListView)findViewById(R.id.listView); listAdapter = new ArrayAdapter( this, android.R.layout.simple_list_item_1, android.R.id.text1, contatos); layout da célula id do TextView modelo listView.setAdapter(listAdapter);

Slide 29

Slide 29 text

Resultado

Slide 30

Slide 30 text

Tópicos 1. ListView e ArrayAdapter 2. Adapter Personalizado 3. Reuso de Células 4. Padrão Holder 5. Interação e ListActivity

Slide 31

Slide 31 text

Adapter Personalizado String Adapter Array ListView

Slide 32

Slide 32 text

Adapter Personalizado Contato Adapter ListView

Slide 33

Slide 33 text

Adapter Personalizado Contato Adapter Contato ListView

Slide 34

Slide 34 text

Modelo Contato.java public class Contato { private long id; private String nome; private String telefone; public Contato(long id, String nome, String telefone) { this.id = id; this.nome = nome; this.telefone = telefone; } // getters e setters }

Slide 35

Slide 35 text

Modelo

Slide 36

Slide 36 text

Modelo MainActivity.java private ListView listView; public class MainActivity extends Activity { private String[] contatos = {"João", "Zé", "Ana"}; // ... private ArrayAdapter listAdapter;

Slide 37

Slide 37 text

Modelo MainActivity.java private ListView listView; public class MainActivity extends Activity { private List contatos = new ArrayList(); // ... private ArrayAdapter listAdapter;

Slide 38

Slide 38 text

Modelo TODO: Adicionar elementos a contatos 
 (em onCreate)

Slide 39

Slide 39 text

Adapter Personalizado ContatoAdapter.java

Slide 40

Slide 40 text

Adapter Personalizado ContatoAdapter.java public class ContatoAdapter extends ArrayAdapter { public ContatoAdapter(Context context, List contatos) { super(context, 0, contatos); } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; return view; } // ... }

Slide 41

Slide 41 text

Adapter Personalizado ContatoAdapter.java public class ContatoAdapter extends ArrayAdapter { public ContatoAdapter(Context context, List contatos) { super(context, 0, contatos); } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; return view; } // ... }

Slide 42

Slide 42 text

Adapter Personalizado ContatoAdapter.java public class ContatoAdapter extends ArrayAdapter { public ContatoAdapter(Context context, List contatos) { super(context, 0, contatos); } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; return view; } // ... } salva o contexto e a lista

Slide 43

Slide 43 text

Adapter Personalizado ContatoAdapter.java public class ContatoAdapter extends ArrayAdapter { public ContatoAdapter(Context context, List contatos) { super(context, 0, contatos); } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; return view; } // ... } cria uma view para cada célula salva o contexto e a lista

Slide 44

Slide 44 text

Adapter Personalizado ContatoAdapter.java @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; return view; }

Slide 45

Slide 45 text

Adapter Personalizado ContatoAdapter.java @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; return view; } Contato contato = getItem(position); if (contato != null) { } definido em ArrayAdapter

Slide 46

Slide 46 text

Adapter Personalizado ContatoAdapter.java @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; return view; } Contato contato = getItem(position); if (contato != null) { } LayoutInflater inflater = (LayoutInflater)getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(android.R.layout.simple_list_item_2, null); definido em ArrayAdapter

Slide 47

Slide 47 text

Adapter Personalizado ContatoAdapter.java @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; return view; } Contato contato = getItem(position); if (contato != null) { } LayoutInflater inflater = (LayoutInflater)getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(android.R.layout.simple_list_item_2, null); TextView text1 = (TextView)view.findViewById(android.R.id.text1); TextView text2 = (TextView)view.findViewById(android.R.id.text2); definido em ArrayAdapter

Slide 48

Slide 48 text

Adapter Personalizado ContatoAdapter.java @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; return view; } Contato contato = getItem(position); if (contato != null) { } LayoutInflater inflater = (LayoutInflater)getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(android.R.layout.simple_list_item_2, null); text1.setText(contato.getNome()); text2.setText(contato.getTelefone()); TextView text1 = (TextView)view.findViewById(android.R.id.text1); TextView text2 = (TextView)view.findViewById(android.R.id.text2); definido em ArrayAdapter

Slide 49

Slide 49 text

Modelo TODO: Editar MainActivity 
 para usar ContactAdapter

Slide 50

Slide 50 text

Tópicos 1. ListView e ArrayAdapter 2. Adapter Personalizado 3. Reuso de Células 4. Padrão Holder 5. Interação e ListActivity

Slide 51

Slide 51 text

Reuso de Células

Slide 52

Slide 52 text

Reuso de Células getView(0, ...) João

Slide 53

Slide 53 text

Reuso de Células getView(0, ...) João getView(1, ...) Zé

Slide 54

Slide 54 text

Reuso de Células getView(0, ...) João getView(1, ...) Zé getView(2, ...) Ana

Slide 55

Slide 55 text

Reuso de Células getView(0, ...) João getView(1, ...) Zé getView(2, ...) Ana getView(3, ...) Maria

Slide 56

Slide 56 text

Reuso de Células getView(0, ...) João getView(1, ...) Zé getView(2, ...) Ana getView(3, ...) Maria

Slide 57

Slide 57 text

Reuso de Células João Zé Ana Maria

Slide 58

Slide 58 text

Reuso de Células João Zé Ana Maria getView(4, ...)

Slide 59

Slide 59 text

Reuso de Células João Zé Ana Maria getView(4, ...)

Slide 60

Slide 60 text

Reuso de Células João Zé Ana Maria getView(4, ...)

Slide 61

Slide 61 text

Reuso de Células João Zé Ana Maria getView(4, ...) Fulano

Slide 62

Slide 62 text

Reuso de Células

Slide 63

Slide 63 text

Reuso de Células ContatoAdapter.java @Override public View getView(int position, View convertView, ViewGroup parent) { View view = return view; } Contato contato = getItem(position); if (contato != null) { LayoutInflater inflater = (LayoutInflater)getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(android.R.layout.simple_list_item_2, null); text1.setText(contato.getNome()); text2.setText(contato.getTelefone()); TextView text1 = (TextView)view.findViewById(android.R.id.text1); TextView text2 = (TextView)view.findViewById(android.R.id.text2); null; }

Slide 64

Slide 64 text

Reuso de Células ContatoAdapter.java @Override public View getView(int position, View convertView, ViewGroup parent) { View view = return view; } Contato contato = getItem(position); if (contato != null) { LayoutInflater inflater = (LayoutInflater)getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(android.R.layout.simple_list_item_2, null); text1.setText(contato.getNome()); text2.setText(contato.getTelefone()); TextView text1 = (TextView)view.findViewById(android.R.id.text1); TextView text2 = (TextView)view.findViewById(android.R.id.text2); ; }

Slide 65

Slide 65 text

Reuso de Células ContatoAdapter.java @Override public View getView(int position, View convertView, ViewGroup parent) { View view = return view; } Contato contato = getItem(position); if (contato != null) { LayoutInflater inflater = (LayoutInflater)getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(android.R.layout.simple_list_item_2, null); text1.setText(contato.getNome()); text2.setText(contato.getTelefone()); TextView text1 = (TextView)view.findViewById(android.R.id.text1); TextView text2 = (TextView)view.findViewById(android.R.id.text2); ; } convertView

Slide 66

Slide 66 text

Reuso de Células ContatoAdapter.java @Override public View getView(int position, View convertView, ViewGroup parent) { View view = return view; } Contato contato = getItem(position); if (contato != null) { LayoutInflater inflater = (LayoutInflater)getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(android.R.layout.simple_list_item_2, null); text1.setText(contato.getNome()); text2.setText(contato.getTelefone()); TextView text1 = (TextView)view.findViewById(android.R.id.text1); TextView text2 = (TextView)view.findViewById(android.R.id.text2); ; } if (view == null) { } convertView

Slide 67

Slide 67 text

Reuso de Células ContatoAdapter.java @Override public View getView(int position, View convertView, ViewGroup parent) { View view = return view; } Contato contato = getItem(position); if (contato != null) { LayoutInflater inflater = (LayoutInflater)getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(android.R.layout.simple_list_item_2, null); text1.setText(contato.getNome()); text2.setText(contato.getTelefone()); TextView text1 = (TextView)view.findViewById(android.R.id.text1); TextView text2 = (TextView)view.findViewById(android.R.id.text2); ; } if (view == null) { } convertView lento!

Slide 68

Slide 68 text

Tópicos 1. ListView e ArrayAdapter 2. Adapter Personalizado 3. Reuso de Células 4. Padrão Holder 5. Interação e ListActivity

Slide 69

Slide 69 text

Padrão Holder ContatoAdapter.java public class ContatoAdapter extends ArrayAdapter { public ContatoAdapter(...) { ... } public View getView(...) { ... } }

Slide 70

Slide 70 text

Padrão Holder ContatoAdapter.java public class ContatoAdapter extends ArrayAdapter { public ContatoAdapter(...) { ... } public View getView(...) { ... } }

Slide 71

Slide 71 text

Padrão Holder ContatoAdapter.java public class ContatoAdapter extends ArrayAdapter { public ContatoAdapter(...) { ... } public View getView(...) { ... } static class ViewHolder { public TextView textNome; public TextView textTelefone; } }

Slide 72

Slide 72 text

Padrão Holder

Slide 73

Slide 73 text

Padrão Holder ContatoAdapter.java @Override public View getView(int position, View convertView, ViewGroup parent) { View view = return view; } Contato contato = getItem(position); if (contato != null) { LayoutInflater inflater = (LayoutInflater)getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(android.R.layout.simple_list_item_2, null); ; } if (view == null) { convertView } TextView text1 = TextView text2 = (TextView)view.findViewById(android.R.id.text1); (TextView)view.findViewById(android.R.id.text2); text1 text2 .setText(contato.getNome()); .setText(contato.getTelefone());

Slide 74

Slide 74 text

Padrão Holder ContatoAdapter.java LayoutInflater inflater = (LayoutInflater)getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(android.R.layout.simple_list_item_2, null); text1 text2 TextView text1 = TextView text2 = if (view == null) { (TextView)view.findViewById(android.R.id.text1); (TextView)view.findViewById(android.R.id.text2); } .setText(contato.getNome()); .setText(contato.getTelefone());

Slide 75

Slide 75 text

Padrão Holder ContatoAdapter.java LayoutInflater inflater = (LayoutInflater)getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(android.R.layout.simple_list_item_2, null); text1 text2 TextView text1 = TextView text2 = if (view == null) { if só é executado durante a criação inicial de células (TextView)view.findViewById(android.R.id.text1); (TextView)view.findViewById(android.R.id.text2); } .setText(contato.getNome()); .setText(contato.getTelefone());

Slide 76

Slide 76 text

Padrão Holder ContatoAdapter.java LayoutInflater inflater = (LayoutInflater)getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(android.R.layout.simple_list_item_2, null); text1 text2 TextView text1 = TextView text2 = if (view == null) { if só é executado durante a criação inicial de células sempre é executado (TextView)view.findViewById(android.R.id.text1); (TextView)view.findViewById(android.R.id.text2); } .setText(contato.getNome()); .setText(contato.getTelefone());

Slide 77

Slide 77 text

Padrão Holder ContatoAdapter.java LayoutInflater inflater = (LayoutInflater)getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(android.R.layout.simple_list_item_2, null); if (view == null) { (TextView)view.findViewById(android.R.id.text1); (TextView)view.findViewById(android.R.id.text2); } text1 text2 .setText(contato.getNome()); .setText(contato.getTelefone());

Slide 78

Slide 78 text

Padrão Holder ContatoAdapter.java LayoutInflater inflater = (LayoutInflater)getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(android.R.layout.simple_list_item_2, null); if (view == null) { (TextView)view.findViewById(android.R.id.text1); (TextView)view.findViewById(android.R.id.text2); } ViewHolder holder = new ViewHolder(); text1 text2 .setText(contato.getNome()); .setText(contato.getTelefone());

Slide 79

Slide 79 text

Padrão Holder ContatoAdapter.java LayoutInflater inflater = (LayoutInflater)getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(android.R.layout.simple_list_item_2, null); if (view == null) { (TextView)view.findViewById(android.R.id.text1); (TextView)view.findViewById(android.R.id.text2); } ViewHolder holder = new ViewHolder(); holder.textNome = holder.textTelefone = text1 text2 .setText(contato.getNome()); .setText(contato.getTelefone());

Slide 80

Slide 80 text

Padrão Holder ContatoAdapter.java LayoutInflater inflater = (LayoutInflater)getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(android.R.layout.simple_list_item_2, null); if (view == null) { (TextView)view.findViewById(android.R.id.text1); (TextView)view.findViewById(android.R.id.text2); } ViewHolder holder = new ViewHolder(); holder.textNome = holder.textTelefone = view.setTag(holder); text1 text2 .setText(contato.getNome()); .setText(contato.getTelefone());

Slide 81

Slide 81 text

Padrão Holder ContatoAdapter.java LayoutInflater inflater = (LayoutInflater)getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(android.R.layout.simple_list_item_2, null); if (view == null) { (TextView)view.findViewById(android.R.id.text1); (TextView)view.findViewById(android.R.id.text2); } ViewHolder holder = new ViewHolder(); holder.textNome = holder.textTelefone = view.setTag(holder); .setText(contato.getNome()); .setText(contato.getTelefone());

Slide 82

Slide 82 text

Padrão Holder ContatoAdapter.java LayoutInflater inflater = (LayoutInflater)getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(android.R.layout.simple_list_item_2, null); if (view == null) { (TextView)view.findViewById(android.R.id.text1); (TextView)view.findViewById(android.R.id.text2); } ViewHolder holder = new ViewHolder(); holder.textNome = holder.textTelefone = view.setTag(holder); .setText(contato.getNome()); .setText(contato.getTelefone()); ViewHolder holder = (ViewHolder)view.getTag();

Slide 83

Slide 83 text

Padrão Holder ContatoAdapter.java LayoutInflater inflater = (LayoutInflater)getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); view = inflater.inflate(android.R.layout.simple_list_item_2, null); if (view == null) { (TextView)view.findViewById(android.R.id.text1); (TextView)view.findViewById(android.R.id.text2); } ViewHolder holder = new ViewHolder(); holder.textNome = holder.textTelefone = view.setTag(holder); .setText(contato.getNome()); .setText(contato.getTelefone()); holder.textNome holder.textTelefone ViewHolder holder = (ViewHolder)view.getTag();

Slide 84

Slide 84 text

Tópicos 1. ListView e ArrayAdapter 2. Adapter Personalizado 3. Reuso de Células 4. Padrão Holder 5. Interação e ListActivity

Slide 85

Slide 85 text

Interação

Slide 86

Slide 86 text

Interação MainActivity.java listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { Contato contato = (Contato)listView.getItemAtPosition(position); String mensagem = "Oi, " + contato.getNome(); Toast.makeText(MainActivity.this, mensagem, Toast.LENGTH_SHORT) .show(); } });

Slide 87

Slide 87 text

ListActivity • extends ListActivity • getListView(...) • setListAdapter(...) • @Override onListItemClick(...)

Slide 88

Slide 88 text

CursorAdapter