== null) { inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } if (convertView == null) { convertView = inflater.inflate(R.layout.linha_lista, null); } if (imageLoader == null) { imageLoader = AppController.getInstance().getImageLoader(); } NetworkImageView imageProd = (NetworkImageView) convertView.findViewById(R.id.imgProduto); TextView txtTitulo = (TextView) convertView.findViewById(R.id.txtTitulo); TextView txtQtde = (TextView) convertView.findViewById(R.id.txtQtde); TextView txtCategoria = (TextView) convertView.findViewById(R.id.txtCategoria); TextView txtValor = (TextView) convertView.findViewById(R.id.txtValor); // Recuperando o produto atual da iteracao final Produto prod = produtos.get(position); imageProd.setImageUrl(prod.getUrlImg(), imageLoader); txtTitulo.setText(prod.getTitulo()); txtQtde.setText("Qtde Vendidos: " + String.valueOf(prod.getQtde())); NumberFormat format = NumberFormat.getCurrencyInstance(new Locale("pt")); txtValor.setText("R$ " + String.valueOf(format.format(prod.getValor()))); String concat = ""; for (String cat : prod.getCategorias()) { concat += cat + ", "; } concat = concat.length() > 0 ? concat.substring(0, concat.length() - 2) : concat; txtCategoria.setText(concat); Button btnAddToCart = (Button) convertView.findViewById(R.id.btnAddToCart); btnAddToCart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { listener.onAddCarrrinhoPressed(prod); } }); return convertView; } public interface ProductListAdapterListener { public void onAddCarrrinhoPressed(Produto produto); }}Apos isso, nos tambem precisamos criar o xml que iterara todos os itens customizados dos produtos. Para isso, crie o arquivo listagem_produtos.xml tambem dentro da pasta res/layout com o seguinite conteudo: Estamos quase la. Agora precisamos criar a Activity que contera os metodos de fachada para lidar com a comunicacao com a API do PayPal. Veja o codigo abaixo:package br.edu.ecommerce;import java.io.UnsupportedEncodingException;import java.math.BigDecimal;import java.math.RoundingMode;import java.net.URLEncoder;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import org.json.JSONArray;import org.json.JSONException;import org.json.JSONObject;import android.app.Activity;import android.app.ProgressDialog;import android.content.Intent;import android.content.SharedPreferences;import android.graphics.Color;import android.graphics.drawable.ColorDrawable;import android.os.Bundle;import android.util.Log;import android.view.Menu;import android.view.View;import android.widget.Button;import android.widget.ListView;import android.widget.SearchView;import android.widget.Toast;import br.edu.devmedia.loja_virtual.R;import br.edu.ecommerce.custom.UTF8ParseJson;import br.edu.ecommerce.custom.adapter.CustomListAdapter;import br.edu.ecommerce.custom.adapter.CustomListAdapter.ProductListAdapterListener;import br.edu.ecommerce.custom.app.AppController;import br.edu.ecommerce.custom.model.Produto;import br.edu.ecommerce.paypal.Config;import com.android.volley.DefaultRetryPolicy;import com.android.volley.Request.Method;import com.android.volley.Response;import com.android.volley.Response.ErrorListener;import com.android.volley.Response.Listener;import com.android.volley.RetryPolicy;import com.android.volley.VolleyError;import com.android.volley.VolleyLog;import com.android.volley.toolbox.JsonArrayRequest;import com.android.volley.toolbox.StringRequest;import com.google.gson.Gson;import com.paypal.android.sdk.payments.PayPalConfiguration;import com.paypal.android.sdk.payments.PayPalItem;import com.paypal.android.sdk.payments.PayPalPayment;import com.paypal.android.sdk.payments.PayPalPaymentDetails;import com.paypal.android.sdk.payments.PayPalService;import com.paypal.android.sdk.payments.PaymentActivity;import com.paypal.android.sdk.payments.PaymentConfirmation;public class ListaProdutosActivity extends Activity implements SearchView.OnQueryTextListener, ProductListAdapterListener { private static final String TAG = ListaProdutosActivity.class.getSimpleName(); private ListView lstProd; private List<Produto> produtos = new ArrayList<Produto>(); private CustomListAdapter adapter; private ProgressDialog progressDialog; // To store the products those are added to cart private List<PayPalItem> produtosCarrinho = new ArrayList<PayPalItem>(); private Button btnCheckout; private static final int CODIGO_PAGTO = 1; // PayPal configuration private static PayPalConfiguration paypalConfig = new PayPalConfiguration().environment(Config.PAYPAL_ENVIRONMENT).clientId(Config.PAYPAL_CLIENT_ID).languageOrLocale("pt_BR"); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listagem_produtos); lstProd = (ListView) findViewById(R.id.listaProd); btnCheckout = (Button) findViewById(R.id.btnCheckout); adapter = new CustomListAdapter(this, produtos, this); lstProd.setAdapter(adapter); progressDialog = new ProgressDialog(this); progressDialog.setCancelable(false); progressDialog.setMessage("Carregando..."); progressDialog.show(); getActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#1b1b1b"))); // Starting PayPal service Intent intent = new Intent(this, PayPalService.class); intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, paypalConfig); startService(intent); // Checkout button click listener btnCheckout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Check for empty cart if (produtosCarrinho.size() > 0) { executarPagtoPayPal(); } else { Toast.makeText(getApplicationContext(), "Carrinho vazio! Favor adicionar produtos!", Toast.LENGTH_SHORT).show(); } } }); // Fetching products from server executarRequestProdutos(null); } private void executarRequestProdutos(String param) { produtos.clear(); if (param != null) { try { param = URLEncoder.encode(param, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } JsonArrayRequest requestProds = new UTF8ParseJson(param != null ? Config.URL_PRODUTOS + "?str=" + param : Config.URL_PRODUTOS, new Listener<JSONArray>() { @Override public void onResponse(JSONArray jsonArray) { esconderDialog(); for (int i = 0; i < jsonArray.length(); i++) { try { JSONObject jsonObj = jsonArray.getJSONObject(i); Gson gson = new Gson(); Produto produto = gson.fromJson(jsonObj.toString(), Produto.class); produtos.add(produto); } catch (JSONException e) { e.printStackTrace(); } } adapter.notifyDataSetChanged(); } }, new ErrorListener() { @Override public void onErrorResponse(VolleyError error) { VolleyLog.d(TAG, "Erro: " + error.getMessage()); esconderDialog(); } }); AppController.getInstance().addToRequestQueue(requestProds); }