Vamos listar o resultado da pesquisa com os seguintes itens: foto, nome e cidade da academia.
Em cada resultado sermos capaz de clicar no item e abrir as opções detalhes e opiniões.
Na classe AcademiaCidade
adicionei mais um item, então ficou assim:
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 |
package br.com.micheladrianomedeiros.ondetreinar.model; public class AcademiaCidade { private Long id; private String nome; private String cidade; private String thumb; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getCidade() { return cidade; } public void setCidade(String cidade) { this.cidade = cidade; } public String getThumb() { return thumb; } public void setThumb(String thumb) { this.thumb = thumb; } @Override public String toString() { return "AcademiaCidade{" + "id=" + id + ", nome='" + nome + '\'' + ", cidade='" + cidade + '\'' + ", thumb='" + thumb + '\'' + '}'; } } |
No arquivo build.gradle do Módulo adicione o seguinte código:
1 2 3 |
viewBinding { enabled = true } |
No mesmo arquivo adicione as seguintes dependências.
1 2 3 4 5 |
def recyclerview_version = "1.0.0" implementation "androidx.recyclerview:recyclerview:$recyclerview_version" implementation "androidx.recyclerview:recyclerview-selection:$recyclerview_version" implementation 'com.github.bumptech.glide:glide:4.8.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0' |
Deixe o arquivo colors.xml da seguinte maneira:
1 2 3 4 5 6 |
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="colorPrimary">#000</color> <color name="colorPrimaryDark">#000</color> <color name="colorAccent">#ff4500</color> </resources> |
Clique com o botão direito do mouse na pasta drawable e escolha a opção New->Vector Asset.
Clique em Clip Art e digite na pesquisa vert, escolha o item more vert.
Ficará assim:
Clique com o botão direito do mouse na pasta layout e escolha a opção Layout Resource File. Dê o nome de academia_cidade.
A programação desse arquivo é a seguinte:
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 |
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/ll_master" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:padding="10dp"> <ImageView android:id="@+id/image_thumb" android:layout_width="100dp" android:layout_height="100dp" android:src="@mipmap/ic_launcher" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_weight="1" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/tv_cidade" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:ellipsize="end" android:text="Cidade" android:textColor="@color/colorAccent" android:textStyle="bold" /> <ImageView android:id="@+id/img_more" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_more_vert_black_24dp" /> </LinearLayout> <TextView android:id="@+id/tv_academia" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="5dp" android:ellipsize="end" android:maxLines="2" android:text="Academia" android:textColor="@color/colorPrimaryDark" android:textSize="20sp" /> </LinearLayout> </LinearLayout> |
No arquivo activity_main.xml adicione no fim o seguinte código:
1 2 3 4 5 6 7 8 9 10 |
<androidx.recyclerview.widget.RecyclerView android:id="@+id/academia_cidade_view" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" android:scrollbars="vertical" /> |
Na pasta res, crie uma subpasta chamada menu. Clique com o botão direito do mouse na pasta menu e escolha a seguinte opção: New->Menu Resource File e dê o nome de menu_sub.
Nesse arquivo digite a seguinte programação:
1 2 3 4 5 6 7 8 9 10 11 12 |
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/detalhes_academia" android:title="Detalhes" app:showAsAction="never" /> <item android:id="@+id/opinioes_academia" android:title="Opiniões" app:showAsAction="never" /> </menu> |
Crie uma classe chamada: CustomAdapter. Eu criei dentro de uma pasta chamada adapters.
Faça a seguinte programação:
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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
package br.com.micheladrianomedeiros.ondetreinar.adapters; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.PopupMenu; import androidx.annotation.NonNull; import androidx.recyclerview.widget.RecyclerView; import com.bumptech.glide.Glide; import com.bumptech.glide.request.RequestOptions; import java.net.URL; import java.util.List; import br.com.micheladrianomedeiros.ondetreinar.R; import br.com.micheladrianomedeiros.ondetreinar.databinding.AcademiaCidadeBinding; import br.com.micheladrianomedeiros.ondetreinar.model.AcademiaCidade; public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.MyViewHolder> { List<AcademiaCidade> academiaCidadeList; Context context; public CustomAdapter(List<AcademiaCidade> academiaCidadeList, Context context) { this.academiaCidadeList = academiaCidadeList; this.context = context; } public static class MyViewHolder extends RecyclerView.ViewHolder { AcademiaCidadeBinding binding; MyViewHolder(AcademiaCidadeBinding b) { super(b.getRoot()); binding = b; } } @NonNull @Override public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { LayoutInflater li = LayoutInflater.from(context); return new MyViewHolder(AcademiaCidadeBinding.inflate(li)); } @Override public void onBindViewHolder(@NonNull MyViewHolder holder, int position) { holder.binding.tvCidade.setText(academiaCidadeList.get(position).getCidade() + " "); holder.binding.tvAcademia.setText(academiaCidadeList.get(position).getNome() + " "); try { URL imageURL = new URL(academiaCidadeList.get(position).getThumb() + " "); RequestOptions options = new RequestOptions() .centerCrop() .placeholder(R.mipmap.ic_launcher_round) .error(R.mipmap.ic_launcher_round); Glide.with(context).load(imageURL).apply(options).into(holder.binding.imageThumb); } catch (Exception e) { Log.i("Erro onBindViewHolder ", e.getMessage()); } holder.binding.imgMore.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showPopupMenu(v); } }); } @Override public int getItemCount() { return academiaCidadeList.size(); } class SubMenuClickListener implements PopupMenu.OnMenuItemClickListener { @Override public boolean onMenuItemClick(MenuItem item) { switch (item.getItemId()) { case R.id.detalhes_academia: Log.i("detalhe", "clicou"); case R.id.opinioes_academia: Log.i("opiniões", "clicou"); } return false; } } public void showPopupMenu(View view) { PopupMenu popup = new PopupMenu(context, view); MenuInflater inflater = popup.getMenuInflater(); inflater.inflate(R.menu.menu_sub, popup.getMenu()); popup.setOnMenuItemClickListener(new SubMenuClickListener()); popup.show(); } } |
Modifiquei o código que estava no método listaDeAcademias().
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
private void listaDeAcademias() { HTTPService service = new HTTPService(editTextSearchGym.getText().toString()); try { List<AcademiaCidade> lista = service.execute().get(); RecyclerView recyclerView = findViewById(R.id.academia_cidade_view); recyclerView.setAdapter(new CustomAdapter(lista, this)); RecyclerView.LayoutManager layout = new LinearLayoutManager( this, LinearLayoutManager.VERTICAL, false); recyclerView.setLayoutManager(layout); } catch (ExecutionException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } |
Código completo do MainActivity.java.
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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
package br.com.micheladrianomedeiros.ondetreinar; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.StrictMode; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.Spinner; import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import java.util.List; import java.util.concurrent.ExecutionException; import br.com.micheladrianomedeiros.ondetreinar.adapters.CustomAdapter; import br.com.micheladrianomedeiros.ondetreinar.model.AcademiaCidade; import br.com.micheladrianomedeiros.ondetreinar.remote.HTTPService; public class MainActivity extends AppCompatActivity { private static final int MENU_GET_REVIEWS = Menu.FIRST; private Spinner spinnerTypesGym; private Button buttonSearchGym; private EditText editTextSearchGym; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editTextSearchGym = findViewById(R.id.search_gym); spinnerTypesGym = findViewById(R.id.spinner_type_gym); buttonSearchGym = findViewById(R.id.button_search_gym); buttonSearchGym.setOnClickListener(buttonClickListener); StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); } private View.OnClickListener buttonClickListener = new View.OnClickListener() { @Override public void onClick(View v) { switch (v.getId()) { case R.id.button_search_gym: boolean b = handleSearch(); if (b) { listaDeAcademias(); } break; case View.NO_ID: default: Log.i("erro", "nada"); break; } } }; private void listaDeAcademias() { HTTPService service = new HTTPService(editTextSearchGym.getText().toString()); try { List<AcademiaCidade> lista = service.execute().get(); RecyclerView recyclerView = findViewById(R.id.academia_cidade_view); recyclerView.setAdapter(new CustomAdapter(lista, this)); RecyclerView.LayoutManager layout = new LinearLayoutManager( this, LinearLayoutManager.VERTICAL, false); recyclerView.setLayoutManager(layout); } catch (ExecutionException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } private boolean handleSearch() { if ((editTextSearchGym.getText() == null) || editTextSearchGym.getText().toString().equals("")) { new AlertDialog.Builder(this).setTitle(R.string.alert_label). setMessage(R.string.location_not_supplied_message). setPositiveButton("Continue", new android.content.DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int arg1) { // Just close alert. } }).show(); return false; } return true; } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(0, this.MENU_GET_REVIEWS, 0, R.string.menu_get_reviews).setIcon( android.R.drawable.ic_menu_more); return true; } public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case MENU_GET_REVIEWS: Intent intent = new Intent(this, ReviewList.class); startActivity(intent); return true; } return false; } @Override protected void onDestroy() { super.onDestroy(); } } |
Veja o resultado.
Deixe um comentário