Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use Dialog inside BaseAdapter?

I am developing an app catalog of products with a horizontal listview, and I can not open a Custom Dialog when you click on the product.

Some parts of my code:

Primary Activity

public class Produtos extends Activity {
    public static String ListadeProdutos;
    private ProdutosAdapter dbHelper;
    private ProgressDialog progressDialog;
    private TiposAdapter tipDB;
    private CategoriasAdapter catDB;
    private AutoCompleteTextView AutBusca;
    public static String cateId, tipoId, filtroAz, busca;
    Cursor AllProdutos;

    //LazyAdapter adapter;

    public static String theProdNome, theProdDesc, theProdFoto;
    public static int ProdutoAtual;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        overridePendingTransition(R.anim.fadein, R.anim.fadeout);
        setContentView(R.layout.produtos);

        cateId = getIntent().getStringExtra("cat");
        tipoId = getIntent().getStringExtra("tipo");
        filtroAz = getIntent().getStringExtra("filtroAz");
        busca = getIntent().getStringExtra("busca");

        theProdNome = getIntent().getStringExtra("prodNome");
        theProdDesc = getIntent().getStringExtra("prodDesc");
        theProdFoto = getIntent().getStringExtra("prodFoto");

The function to show Dialog

public void showProdutoDialog(){
  final Dialog dialog = new Dialog(this,R.style.CustomDialogTheme);

  dialog.setContentView(R.layout.produto);//carregando o layout do dialog do xml

  if ( theProdNome != "" ){
    //carrega os dados
    TextView titulo = (TextView) dialog.findViewById(R.id.NomeProduto);
    WebView desc = (WebView) dialog.findViewById(R.id.DescricaoProduto);
    ImageView img = (ImageView) dialog.findViewById(R.id.FotoProduto);

    titulo.setText(theProdNome);

    String html; 
    html = "<strong>Características do Produto</strong><br>"+ theProdDesc;

    String mime = "text/html";
    String encoding = "utf-8";

    desc.getSettings().setJavaScriptEnabled(false);
    desc.loadDataWithBaseURL(null, html, mime, encoding, null);
    desc.setBackgroundColor(Color.TRANSPARENT);
    desc.scrollTo(0, 0);

        final Button fechar = (Button) dialog.findViewById(R.id.bt_fechar);
    fechar.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            //ação do botão cancelar
            dialog.dismiss();//encerra o dialog
        }
    });

       dialog.show();//mostra o dialog

   }else{
       Toast.makeText(this, "Nenhum impresso encontrado", Toast.LENGTH_SHORT).show(); 
   }

  }

BaseAdapter Activity

public class ProdutoAdapter extends BaseAdapter {
    ImageDownloader downloader;
    private List<Produto> MyProdutos;
    private LayoutInflater mInflater;
    private ViewHolder holder;

    static class ViewHolder{
        private TextView titulo;
        private ImageView img;
    }


    public ProdutoAdapter(Context context, List<Produto> MyProdutos) {
        mInflater = LayoutInflater.from(context);
        this.MyProdutos = MyProdutos;
        downloader = new ImageDownloader();
    }


    @Override
    public int getCount() {
        return MyProdutos.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int posicao, View convertView, ViewGroup arg2) {
        final Produto p = MyProdutos.get(posicao);

            convertView = mInflater.inflate(R.layout.row_produtos, null);
            holder = new ViewHolder();

            holder.titulo = (TextView) convertView.findViewById(R.id.NomeProduto);
            holder.img = (ImageView) convertView.findViewById(R.id.FotoProduto);
            holder.img.setOnClickListener(new OnClickListener() {

                public void onClick(View v) {
                    Produtos firstClass = new Produtos();

                    firstClass.theProdNome = p.getNome();
                    firstClass.theProdDesc = p.getProdDesc();
                    firstClass.theProdFoto = p.getimgNome();


                    firstClass.showProdutoDialog();
                }

            });

        convertView.setTag(holder);

        holder.titulo.setText(p.getNome());
        downloader.download(p.getimgNome(), holder.img);


        return convertView;
    }

}

The error

07-03 09:30:07.639: W/dalvikvm(455): threadid=1: thread exiting with uncaught exception (group=0x40014760)
07-03 09:30:07.659: E/AndroidRuntime(455): FATAL EXCEPTION: main
07-03 09:30:07.659: E/AndroidRuntime(455): java.lang.IllegalStateException: System services not available to Activities before onCreate()
07-03 09:30:07.659: E/AndroidRuntime(455):  at android.app.Activity.getSystemService(Activity.java:3922)
07-03 09:30:07.659: E/AndroidRuntime(455):  at android.app.Dialog.<init>(Dialog.java:150)
07-03 09:30:07.659: E/AndroidRuntime(455):  at android.app.Dialog.<init>(Dialog.java:138)
07-03 09:30:07.659: E/AndroidRuntime(455):  at com.primeiroestilo.Produtos.showProdutoDialog(Produtos.java:570)
07-03 09:30:07.659: E/AndroidRuntime(455):  at com.primeiroestilo.ProdutoAdapter$1.onClick(ProdutoAdapter.java:83)
07-03 09:30:07.659: E/AndroidRuntime(455):  at android.view.View.performClick(View.java:3110)
07-03 09:30:07.659: E/AndroidRuntime(455):  at android.view.View$PerformClick.run(View.java:11934)
07-03 09:30:07.659: E/AndroidRuntime(455):  at android.os.Handler.handleCallback(Handler.java:587)
07-03 09:30:07.659: E/AndroidRuntime(455):  at android.os.Handler.dispatchMessage(Handler.java:92)
07-03 09:30:07.659: E/AndroidRuntime(455):  at android.os.Looper.loop(Looper.java:132)
07-03 09:30:07.659: E/AndroidRuntime(455):  at android.app.ActivityThread.main(ActivityThread.java:4123)
07-03 09:30:07.659: E/AndroidRuntime(455):  at java.lang.reflect.Method.invokeNative(Native Method)
07-03 09:30:07.659: E/AndroidRuntime(455):  at java.lang.reflect.Method.invoke(Method.java:491)
07-03 09:30:07.659: E/AndroidRuntime(455):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841)
07-03 09:30:07.659: E/AndroidRuntime(455):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599)
07-03 09:30:07.659: E/AndroidRuntime(455):  at dalvik.system.NativeStart.main(Native Method)

prints

Listview of products - http://cl.ly/2l0W0u421U1s0t3p2v15

product opened - http://cl.ly/0R2s0g2a1C0J171b0n3z

I can solve my problem!!! Yeah!!! \o/ #

On the Primary Activity i change:

    ProdutoAdapter adapter = new ProdutoAdapter(getApplicationContext(), produtos);  

To

    ProdutoAdapter adapter = new ProdutoAdapter(Produtos.this, produtos);

And on BaseAdapter Activity I change:

    public ProdutoAdapter(Context context, List<Produto> MyProdutos) {  
         mInflater = LayoutInflater.from(context);  
         this.MyProdutos = MyProdutos;  
         downloader = new ImageDownloader();  
    }  

TO

    public ProdutoAdapter(Produtos context, List<Produto> MyProdutos) {  
        mInflater = LayoutInflater.from(context);  
        this.MyProdutos = MyProdutos;  
        downloader = new ImageDownloader();  
        mContext = context;  
    }

And add:

    private Produtos mContext;  

And change:

    firstClass.showProdutoDialog();  

TO

    mContext.showProdutoDialog();
like image 852
Filipe Braganca Avatar asked Nov 13 '22 02:11

Filipe Braganca


1 Answers

What is firstClass? Is it an Activity? try to create the Dialog like this:

Context mContext = getApplicationContext();
Dialog dialog = new Dialog(mContext);

If you can't get the context by using getApplicationContext(), save the context that the ProdutoAdapter receives in the constructor. than pass this context to:

 Context mContext;
 public ProdutoAdapter(Context context, List<Produto> MyProdutos) {
    mInflater = LayoutInflater.from(context);
    this.MyProdutos = MyProdutos;
    downloader = new ImageDownloader();
    mContext = context;
}

when you call showProdutoDialog do it like this:

firstClass.showProdutoDialog(mContext);

than, do:

  public void showProdutoDialog(Context context){
      final Dialog dialog = new Dialog(context,R.style.CustomDialogTheme);
      //continue from here
like image 58
Uriel Frankel Avatar answered Nov 16 '22 03:11

Uriel Frankel