如何在BaseAdapter中使用Dialog?

时间:2012-07-03 12:38:12

标签: android listview dialog baseadapter

我正在使用水平列表视图开发产品的应用程序目录,当您单击产品时我无法打开自定义对话框。

我的代码的某些部分:

主要活动

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");

显示对话框的功能

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活动

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;
    }

}

错误

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)

打印

产品列表视图 - http://cl.ly/2l0W0u421U1s0t3p2v15

产品已开通 - http://cl.ly/0R2s0g2a1C0J171b0n3z

我可以解决我的问题!!!是啊! \ o /#

主要活动上,我改变了:

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

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

BaseAdapter活动上,我改变了:

    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;  
    }

添加

    private Produtos mContext;  

更改

    firstClass.showProdutoDialog();  

TO

    mContext.showProdutoDialog();

1 个答案:

答案 0 :(得分:1)

什么是firstClass?这是活动吗?尝试创建像这样的对话:

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

如果使用getApplicationContext()无法获取上下文,请保存ProdutoAdapter在构造函数中接收的上下文。而不是将此上下文传递给:

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

当你调用showProdutoDialog时这样做:

firstClass.showProdutoDialog(mContext);

比,做:

  public void showProdutoDialog(Context context){
      final Dialog dialog = new Dialog(context,R.style.CustomDialogTheme);
      //continue from here