Esta parte pegará a lista de Levels para cada Mode direto do Banco de Dados e depois mostrará na aba correspondente.
GameSelect.java
Nós vamos editar o arquivo GameSelect.java que já existe e vamos adicionar um CustomAdapter chamado LevelAdapter, o qual terá um nome para o level, pontuação, porcentagem de erros e uma estrela. Para mais informações, olhe os comentários e os logs dentro do código.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
// mostra a lista de levels por tipo private void showLevelList(String type) { Cursor tutorialCursor = DatabaseAdapter.fetchLevelsByType(this, Integer.valueOf(type)); startManagingCursor(tutorialCursor); // seta o adapter do listview mListView.setAdapter(new LevelAdapter(this, tutorialCursor, new String[] {}, new int[] {})); } // retorna informações do level para cada posição // colunas: 0=LEVEL_ID, 1=LEVEL_TYPE, 2=LEVEL_SHOTS, 3=LEVEL_NAME private String getLevelInfo(int position, int column) { return ((Cursor) ((LevelAdapter) mListView.getAdapter()).getItem(position)).getString(column); } // custom adapter com nome do level, pontuação, porcentagem e estrela private class LevelAdapter extends SimpleCursorAdapter { private ContentValues recordInfo = null; private Activity mActivity; private ImageView mStar; private TextView mScore; private TextView mRatio; private TextView mLevel; private int misses = 0; private int total = 0; LevelAdapter(Activity context, Cursor c, String[] from, int[] to) { super(context, R.layout.level_row, c, from, to); this.mActivity = context; } public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { LayoutInflater inflater = mActivity.getLayoutInflater(); convertView = inflater.inflate(R.layout.level_row, null); } // seta o nome do level (coluna 3) mLevel = (TextView) convertView.findViewById(R.id.row_level); mLevel.setText(getLevelInfo(position, 3)); // seta a imagem da estrela padrão mStar = (ImageView) convertView.findViewById(R.id.row_star); mStar.setImageResource(STAR_NONE); // seta a pontuação padrão mScore = (TextView) convertView.findViewById(R.id.row_score); mScore.setText("-"); // seta a porcentagem de acertos padrão mRatio = (TextView) convertView.findViewById(R.id.row_ratio); mRatio.setText("-"); // retorna informações do recorde deste level recordInfo = DatabaseAdapter.fetchRecord(getBaseContext(), getLevelInfo(position, 0)); if (recordInfo != null && recordInfo.size() > 0) { misses = recordInfo.getAsInteger(DatabaseAdapter.RECORD_MISSES); total = Integer.valueOf(getLevelInfo(position, 2)); if (misses > 0) { // se houver qualquer erro, mostrar a meia estrela mStar.setImageResource(STAR_HALF); } else { // se não houver erros, mostrar a estrela cheia mStar.setImageResource(STAR_FULL); } // mostra a pontuação e a porcentagem de acertos if (total != 0) { mScore.setText(recordInfo.getAsString(DatabaseAdapter.RECORD_SCORE) + " " + getText(R.string.points)); mRatio.setText(((total - misses) * 100 / total) + "%"); } } return convertView; } } |
Depois disso, vamos modificar o OnTabChangeListener e o createTabContent para mostrar a lista de Levels quando eles forem acionados.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@Override public void onTabChanged(String tabId) { Log.d(TAG, TAG_NAME + "onTabChanged - " + tabId); mCurrentTAB = tabId; // mostra a lista de levels showLevelList(tabId); } @Override public View createTabContent(String tag) { mCurrentTAB = tag; showLevelList(mCurrentTAB); return mListView; } |
Finalmente, nós vamos adicionar um OnItemClickListener no mListView, que será responsável por selecionar e iniciar o Level escolhido.
1 2 3 4 5 6 7 8 9 |
mListView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { Log.d(TAG, TAG_NAME + "onItemClick - " + arg3); Toast.makeText(getBaseContext(), "Selected item: id=" + arg3, Toast.LENGTH_SHORT).show(); // TODO: iniciar o jogo neste level } }); |
level_row.xml
Esta é nossa linha customizada, ela mostrará o nome do level, pontuação, porcentagem de acertos e uma estrela.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<?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="fill_parent" android:layout_gravity="center_vertical" android:paddingLeft="5dip" android:paddingRight="10dip" > <ImageView android:id="@+id/row_star" android:layout_width="28dip" android:layout_height="50dip" android:layout_alignParentLeft="true" android:gravity="center_vertical" android:src="@drawable/star_none" /> <TextView android:id="@+id/row_level" android:layout_width="wrap_content" android:layout_height="50dip" android:layout_toRightOf="@id/row_star" android:gravity="center_vertical" android:paddingLeft="10dip" android:textSize="20dip" /> <TextView android:id="@+id/row_ratio" android:layout_width="60dip" android:layout_height="50dip" android:layout_alignParentRight="true" android:gravity="center_vertical" android:textSize="20dip" /> <TextView android:id="@+id/row_score" android:layout_width="160dip" android:layout_height="50dip" android:layout_toLeftOf="@id/row_ratio" android:gravity="center_vertical" android:textSize="20dip" /> </RelativeLayout> |
strings.xml
Adicione esta string no seu arquivo strings.xml.
1 |
<string name="points">pontos</string> |
Projeto SVN:
PingPong Madness Tutorial – Parte 07 SVN
APK:
PingPong Madness Tutorial – Parte 07.apk
Tutorial:
- Início
- Parte 06 – Banco de Dados
- Parte 08 (em breve)
Aguardando, ansiosamente pela parte 8. Muito bom esse tutorial.
qdo sai a parte 8?
Quando sai a part 08?? ancioso para o dia… abracos…
Eai Thiago blz? Sou iniciante, aqui deu tudo certo… porem ficou incompleto e eu não sei como terminar esse projeto sozinho, e pelo jeito parece que vc abandonou o tutorial ? :(
Bom vou ficar aguardando… se resolver continuar, me avise por favor. Obrigado! :)