[Java/Android] Botão em um Adapter chamando um método na MainActivity

1. [Java/Android] Botão em um Adapter chamando um método na MainActivity

Diego Mendes Rodrigues
diegomrodrigues

(usa Ubuntu)

Enviado em 22/11/2018 - 13:17h

Prezados,

Estou desenvolvendo um app, onde tenho um Adapter, e com este Adapter, exibo uma lista de clientes na tela de um Fragment.

Na listagem (Fragment), exibo o Nome, E-mail e um botão Selecione.

Ao clicar nesse botão, preciso chamar um método que está na MainActivity.

Como posso fazer isso?

Projeto completo:
https://www.geocatalogo.com.br/exemplo/DuvidaBotaoAdapter.zip

MainActivity.java

package br.com.drsolutions.duvidabotaoadapter.Activity;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import br.com.drsolutions.duvidabotaoadapter.Fragment.ClientesFragment;
import br.com.drsolutions.duvidabotaoadapter.Fragment.InicialFragment;
import br.com.drsolutions.duvidabotaoadapter.Interface.XmlClickableClientes;
import br.com.drsolutions.duvidabotaoadapter.Interface.XmlClickableInicial;
import br.com.drsolutions.duvidabotaoadapter.R;

/**
* Classe inicial do sistema
*
* @author Diego Mendes Rodrigues
* @author drSolutions Tecnologia em Informática
* @see <a href='https://www.drsolutions.com.br'>https://www.drsolutions.com.br</a>
* @version 1.0
*/
public class MainActivity extends AppCompatActivity {

// Fragmentos
XmlClickableInicial inicialFragment;
XmlClickableClientes clientesFragment;

private TextView textCliente;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// Fragmento (tela) inicial
inicialFragment = new InicialFragment();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.container_conteudo, (Fragment) inicialFragment);
fragmentTransaction.commit();

// Fragmento Clientes
clientesFragment = new ClientesFragment();
}

/**
* Alterar o Cliente Selecionado
* @param nome sendo o nome do Cliente
*/
public void alterarCliente(String nome) {
inicialFragment.alterarCliente(nome);
}

/**
* Clique no botão 'Selecionar' no InicialFragment
* @param v sendo a view
*/
public void btnInicialSelecionarClickMethod(View v) {
clientesFragment = new ClientesFragment();
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.container_conteudo, (Fragment) clientesFragment);
fragmentTransaction.commit();
}
}


AdapterClientes.java

package br.com.drsolutions.duvidabotaoadapter.Adapter;

import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.util.List;

import br.com.drsolutions.duvidabotaoadapter.Model.Cliente;
import br.com.drsolutions.duvidabotaoadapter.R;

import static br.com.drsolutions.duvidabotaoadapter.R.layout.adapter_cliente;

/**
* Adapter de Clientes
*
* @author Diego Mendes Rodrigues
* @author drSolutions Tecnologia em Informática
* @see <a href='https://www.drsolutions.com.br'>https://www.drsolutions.com.br</a>
* @version 1.0
*/
public class AdapterClientes extends RecyclerView.Adapter<AdapterClientes.MyViewHolder> {

List<Cliente> listaClientes;

public AdapterClientes(List<Cliente> listaClientes) {
this.listaClientes = listaClientes;
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemLista = LayoutInflater.from(parent.getContext()).inflate(adapter_cliente,
parent, false);
return new MyViewHolder(itemLista);
}

@Override
public void onBindViewHolder(@NonNull final MyViewHolder holder, int position) {
Cliente cliente = listaClientes.get(position);
holder.nome.setText(cliente.getNome());
holder.email.setText(cliente.getEmail());

/**
* Listener colocado no botão 'Selecione' que aparece para cada Cliente
*/
holder.btnSelecione.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(),
"Cliente Selecionado: " + holder.nome.getText().toString(),
Toast.LENGTH_LONG).show();

/**
* ****************************************
* ****************************************
*
* COMO EXECUTAR O MÉTODO
*
* public void alterarCliente(String nome)
*
* QUE ESTÁ NA MainActivity?
*
* ****************************************
* ****************************************
*/

}
});
}

@Override
public int getItemCount() {
return listaClientes.size();
}

public class MyViewHolder extends RecyclerView.ViewHolder {
TextView nome;
TextView email;
Button btnSelecione;

public MyViewHolder(View itemView) {
super(itemView);

nome = itemView.findViewById(R.id.textNomeCliente);
email = itemView.findViewById(R.id.textEmailCliente);
btnSelecione = itemView.findViewById(R.id.buttonSelecione);
}
}
}


ClientesFragment.java

package br.com.drsolutions.duvidabotaoadapter.Fragment;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v7.widget.DividerItemDecoration;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;

import java.util.ArrayList;
import java.util.List;

import br.com.drsolutions.duvidabotaoadapter.Adapter.AdapterClientes;
import br.com.drsolutions.duvidabotaoadapter.Interface.XmlClickableClientes;
import br.com.drsolutions.duvidabotaoadapter.Model.Cliente;
import br.com.drsolutions.duvidabotaoadapter.R;

/**
* Fragment para gerar a tela de Clientes do Sistema
*
* @author Diego Mendes Rodrigues
* @author drSolutions Tecnologia em Informática
* @see <a href='https://www.drsolutions.com.br'>https://www.drsolutions.com.br</a>
* @version 1.0
*/
public class ClientesFragment extends Fragment implements XmlClickableClientes {

private RecyclerView recyclerClientes;
private List<Cliente> listaClientes = new ArrayList<>();

public ClientesFragment() {
// Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_clientes, container, false);

recyclerClientes = view.findViewById(R.id.recyclerClientes);

// Listagem de Clientes
this.criarClientes();

// Configurar o Adaptador (adapter)
AdapterClientes adapterMeusClientes = new AdapterClientes(listaClientes);

// Configurar o RecyclerView
// RecyclerView terá um tamanho fixo - Recomendação para melhorar a performance
recyclerClientes.setHasFixedSize(true);

// Colocar um traço de divisão entre cada cliente
recyclerClientes.addItemDecoration(new DividerItemDecoration(view.getContext(),
LinearLayout.VERTICAL));

// Utilizar o LinearLayout
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(view.getContext());
recyclerClientes.setLayoutManager(layoutManager);

// Definir a adaptador
recyclerClientes.setAdapter(adapterMeusClientes);

return view;
}

@Override
public void btnClientesSelecionarClickMethod(View v) {
// Não está sendo utilizado, pois o botão está no Adapter
}

/**
* Criar lista temporária de clientes para testar esta tela
*/
public void criarClientes() {
Cliente cliente = new Cliente();
cliente.setNome("Ana Maria Almeida");
cliente.setEmail("ana.maria@exemplo.com");
listaClientes.add(cliente);

cliente = new Cliente();
cliente.setNome("Bruna Lobato Herrero");
cliente.setEmail("bruna.lobato@exemplo.com");
listaClientes.add(cliente);

cliente = new Cliente();
cliente.setNome("Carolina Degani Barbosa");
cliente.setEmail("carol.degani@exemplo.com");
listaClientes.add(cliente);
}
}


InicialFragment.java

package br.com.drsolutions.duvidabotaoadapter.Fragment;


import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import br.com.drsolutions.duvidabotaoadapter.Interface.XmlClickableInicial;
import br.com.drsolutions.duvidabotaoadapter.R;

/**
* Fragment para gerar a Tela Inicial do Sistema
*
* @author Diego Mendes Rodrigues
* @author drSolutions Tecnologia em Informática
* @see <a href='https://www.drsolutions.com.br'>https://www.drsolutions.com.br</a>
* @version 1.0
*/
public class InicialFragment extends Fragment implements XmlClickableInicial {

TextView textCliente;

public InicialFragment() {
// Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_inicial, container, false);

textCliente = view.findViewById(R.id.textCliente);

return view;
}

@Override
public void btnInicialSelecionarClickMethod(View v) {
// Código em MainActivity
}

/**
* Alterar o Cliente Selecionado
* @param nome sendo o nome do Cliente
*/
@Override
public void alterarCliente(String nome) {
if (nome.length() > 0)
textCliente.setText(nome);
else
Toast.makeText(getContext(), "Nome do Cliente não enviado",
Toast.LENGTH_SHORT).show();
}
}


XmlClickableClientes.java

package br.com.drsolutions.duvidabotaoadapter.Interface;

import android.view.View;

/**
* Interface utilizada no ClientesFragment
*
* @author Diego Mendes Rodrigues
* @author drSolutions Tecnologia em Informática
* @see <a href='https://www.drsolutions.com.br'>https://www.drsolutions.com.br</a>
* @version 1.0
*/
public interface XmlClickableClientes {
void btnClientesSelecionarClickMethod(View v);
}


XmlClickableInicial.java

package br.com.drsolutions.duvidabotaoadapter.Interface;

import android.view.View;

/**
* Interface utilizada no InicialFragment
*
* @author Diego Mendes Rodrigues
* @author drSolutions Tecnologia em Informática
* @see <a href='https://www.drsolutions.com.br'>https://www.drsolutions.com.br</a>
* @version 1.0
*/
public interface XmlClickableInicial {
void btnInicialSelecionarClickMethod(View v);
void alterarCliente(String nome);
}


activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
@author Diego Mendes Rodrigues
@author drSolutions Tecnologia em Informática
@see https://www.drsolutions.com.br
@version 1.0
-->
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".Activity.MainActivity">

<FrameLayout
android:id="@+id/container_conteudo"
android:layout_width="match_parent"
android:layout_height="match_parent"></FrameLayout>

</android.support.design.widget.CoordinatorLayout>


adapter_cliente.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
@author Diego Mendes Rodrigues
@author drSolutions Tecnologia em Informática
@see https://www.drsolutions.com.br
@version 1.0
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
android:id="@+id/textNomeCliente"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:gravity="start"
android:text="@string/txt_adap_clientes_nome"
android:textSize="18sp" />

<TextView
android:id="@+id/textEmailCliente"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:gravity="start"
android:text="@string/txt_adap_clientes_email"
android:textSize="18sp" />

<Button
android:id="@+id/buttonSelecione"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="24dp"
android:text="@string/txt_adap_clientes_selecione"
android:textAllCaps="false" />

</LinearLayout>


fragment_clientes.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
@author Diego Mendes Rodrigues
@author drSolutions Tecnologia em Informática
@see https://www.drsolutions.com.br
@version 1.0
-->
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Fragment.ClientesFragment">

<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="16dp"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:text="@string/txt_clientes_clientes"
android:textSize="24sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerClientes"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:layout_marginBottom="8dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />

</android.support.constraint.ConstraintLayout>


fragment_inicial.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
@author Diego Mendes Rodrigues
@author drSolutions Tecnologia em Informática
@see https://www.drsolutions.com.br
@version 1.0
-->
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Fragment.InicialFragment">

<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="32dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:text="@string/txt_inicial_cliente_selecionado"
android:textSize="24sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<TextView
android:id="@+id/textCliente"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="24dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:text="@string/txt_inicial_nao_selecionado"
android:textSize="18sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView2" />

<Button
android:id="@+id/buttonSelecionar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginLeft="16dp"
android:layout_marginTop="32dp"
android:layout_marginEnd="16dp"
android:layout_marginRight="16dp"
android:onClick="btnInicialSelecionarClickMethod"
android:text="@string/txt_inicial_selecionar"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textCliente" />

</android.support.constraint.ConstraintLayout>


strings.xml

<resources>
<string name="app_name">Dúvida - Botão no Adapter</string>

<!-- InicialFragment -->
<string name="txt_inicial_cliente_selecionado">Cliente Selecionado:</string>
<string name="txt_inicial_nao_selecionado">Nenhum cliente selecionado</string>
<string name="txt_inicial_selecionar">Selecionar</string>

<!-- ClientesFragment -->
<string name="txt_clientes_clientes">Clientes</string>

<!-- adapter_clientes -->
<string name="txt_adap_clientes_nome">Nome</string>
<string name="txt_adap_clientes_email">E-mail</string>
<string name="txt_adap_clientes_selecione">Selecione</string>
</resources>


Obrigado,
Diego M. Rodrigues


  


2. Cria uma interface

Gilberto Ramos de O.
Vida!=Palco

(usa Debian)

Enviado em 13/01/2019 - 02:17h

Me perdoe colega se eu for pouco detalhista,pois essa e a minha primeira vez nessa comunidade do vivaolinux java.

Bem respondendo a sua pergunta vc pode adotar um designer patterns conhecido como MVP ou pelo menos usar uma pequena ideia básicas baseada em interfaces.

Um exemplo de uma implementação baseada na sua situação(Uma Possível Resposta):



//O mais legal e que vc pode implementar essa interface em qualquer Activity( Polimorfismo ) e o nosso adapter poderá se referenciar a nossa activity do tipo MainView e todas as tarefas que uma activity do tipo MainView pode e deve fazer,

/* Crie uma Interface que representa os deveres e operações da MainActivity e chame ela de MainView */

public interface MainView{
//Ações que essa view possui
void btnInicialSelecionarClickMethod(View v);
void alterarCliente(String nome);
}


//Depois implemente na MainActivity a interface MainView

//Atenção não se esqueça da Annotation @Override nos métodos

public class MainActivity extends AppCompatActivity implements MainView{ //Implementando
...
/*Amigo não entendi o seu codigo por completo mais acredito que será basicamente colocar isso */
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// Fragmento (tela) inicial
inicialFragment = new InicialFragment(this);/* !! Note que passei a min mesmo no construtor ,ao seja, passei uma implementação MainView */
/* Atenção não se esqueça de alterar o construtor de InicialFragment para receber ( MainView activity )*/

FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.container_conteudo, (Fragment) inicialFragment);
fragmentTransaction.commit();

// Fragmento Clientes
/* Atenção não se esqueça de alterar o construtor de ClientesFragment para ( MainView activity ) */
clientesFragment = new ClientesFragment(this);/* Note que passei a min mesmo no construtor ,ao seja, passei uma implementação MainView */
}

}


No final vc deverá alterar o construtor dessas classes ou somente da classe que chamara o adapter e passar no construtor do adapter o MainView recebido pela classe ClientesFragment ou InicialFragment sejá qual criar o adapter então
no adapter seria algo do tipo:


public class AdapterClientes extends RecyclerView.Adapter<AdapterClientes.MyViewHolder> {

List<Cliente> listaClientes;
MainView activity;

public AdapterClientes(List<Cliente> listaClientes, MainView activity) {//Novo Construtor pegando o uma implementação do MainView
this.listaClientes = listaClientes;
this.activity = activity;// Referenciando a Activity
}
...
holder.btnSelecione.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(),
"Cliente Selecionado: " + holder.nome.getText().toString(),
Toast.LENGTH_LONG).show();

//Chamando MainActivy, creio que seja basicamente essa a resposta

this.activity.btnInicialSelecionarClickMethod(v);
this.activity.alterarCliente("Cavalo");

/**
* ****************************************
* ****************************************
*
* COMO EXECUTAR O MÉTODO
*
* public void alterarCliente(String nome)
*
* QUE ESTÁ NA MainActivity?
*
* ****************************************
* ****************************************
*/
}
});
...
}


Espero ter te ajudado Amigo! Ao invés de só encher linguiça, mas qualquer duvida estamos aqui!
Eu também estudo as vezes java para Android.