且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何使BaseAdapter显示AlertDialog Android应用

更新时间:2023-01-23 21:24:11

您100%肯定,当你创建你的适配器要传递活动时,通过这一作为参数?

要检查的一个好方法是修改这样的应用程序:

添加一个活动参数适配器

 私人上下文的背景下;
私人活动parentActivity;
...
公共MyCasesListAdapter(上下文的背景下,名单,其中,MyCaseClass> listPhonebook,活动parentActivity){
    this.context =背景;
    this.listOfCases = listPhonebook;
    this.parentActivity = parentActivity;
}
 

创建这样的警告对话框...

  AlertDialog alertDialog =新AlertDialog.Builder(parentActivity);
 

最后,调用你的适配器的构造器这样的...

  MyCasesListAdapter适配器=新MyCasesListAdapter(这一点,listOfPhonebook,MyPage.this);
 

说明:您可能不需要在活动和上下文传递到你的基地适配器,但我这样做只是让你可以保持一切作为是暂时。我不知道这个,当你实例化适配器,实际上是一个活动。我在构造函数中的活动,迫使你不得不通过在活动中定义的第3个参数。你会得到,如果你尝试过的东西,是不是和活动编译错误,所以它应该帮助你。

另外,我只注意到,但问题可能是更新的code仍在尝试使用MyCasesListAdapter.this的背景下,这是不是一项活动创建AlertDialog。

How can I make the button in BaseAdapter in listView shows alertDialog, I tried that but it Stopped work unexpected (RunTime Error) my code is shown below .

any suggestion

thanks in advance

Monerah

====after Update =====================

import java.util.List;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MyCasesListAdapter extends BaseAdapter {
    private Context context;

    private List<MyCaseClass> listOfCases;

    // TODO delete it not imp.
    public MyCasesListAdapter() {

        super();

    }

    public MyCasesListAdapter(Context context, List<MyCaseClass> listPhonebook) {
        this.context = context;
        this.listOfCases = listPhonebook;
    }

    public int getCount() {
        return listOfCases.size();
    }

    public Object getItem(int position) {
        return listOfCases.get(position);
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup viewGroup) {
        MyCaseClass entry = listOfCases.get(position);

        if (convertView == null) {

            LayoutInflater inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.mypage_row, null);


        }

        // this is row items..
        // Set the onClick Listener on this button
        Button ConfExpandRegion  = (Button) convertView.findViewById(R.id.expand);
        Button Cancelb = (Button) convertView.findViewById(R.id.cancelCase);
        TextView tvCase = (TextView) convertView.findViewById(R.id.mypage_name);

        //To be a clickable button
        ConfExpandRegion.setFocusableInTouchMode(false);
        ConfExpandRegion.setFocusable(false);
       //For Dialog
        AlertDialog alertDialog = new AlertDialog.Builder(MyCasesListAdapter.this);
       alertDialog.setTitle("Conformation");
       alertDialog.setMessage("Are you sure you want to do ???");
        ConfExpandRegion.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                    alertDialog.setButton("Yes", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int which) {
                      // Some code

                       //ConfExpandRegion.setEnabled(false);
                   }

                });

                alertDialog.setButton2("No", new DialogInterface.OnClickListener() {
                   public void onClick(DialogInterface dialog, int which) {
                    // here you can add functions
                    // Do nothing 




                   }
                });

                alertDialog.setIcon(android.R.drawable.ic_dialog_alert);
                alertDialog.show();




        }});

       //To be a clickable button
        Cancelb.setFocusableInTouchMode(false);
        Cancelb.setFocusable(false);
        Cancelb.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {
                // TODO Auto-generated method stub
                MyCaseClass entry = (MyCaseClass) v.getTag();
                listOfCases.remove(entry);
                // listPhonebook.remove(view.getId());
                notifyDataSetChanged();
            }
        });

        // Set the entry, so that you can capture which item was clicked and
        // then remove it
        // As an alternative, you can use the id/position of the item to capture
        // the item
        // that was clicked.
        ConfExpandRegion.setTag(entry);
        Cancelb.setTag(entry);


        // btnRemove.setId(position);


        return convertView;
    }

    public void onClick(View view) {
        MyCaseClass entry = (MyCaseClass) view.getTag();
        listOfCases.remove(entry);
        // listPhonebook.remove(view.getId());
        notifyDataSetChanged();

    }

    private void showDialog(MyCaseClass entry) {
        // Create and show your dialog
        // Depending on the Dialogs button clicks delete it or do nothing
    }

    public void add(MyCaseClass myCaseClass) {
        // TODO Auto-generated method stub
        listOfCases.add(myCaseClass);
    }






}

//============================================================================

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

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

public class MyPage extends Activity {

    Button createForm;
    Button ConfExpandRegion, Cancelb;
    String ExpandMsg, CancelMsg;
    boolean b;
    MyCaseClass mycase;
    TextView tvCase;
    AlertDialog alertDialog;

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


        // Moving to anther activity
        createForm = (Button) findViewById(R.id.creat_new_formbtn);
        createForm.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                Intent j = new Intent(MyPage.this, CreateNewForm.class);
                startActivity(j);

            }
        });

        // ============================================================================================
        // for list


            ListView list = (ListView) findViewById(R.id.mypage_list);
            list.setClickable(true);

            final List<MyCaseClass> listOfPhonebook = new ArrayList<MyCaseClass>();

            MyCasesListAdapter adapter = new MyCasesListAdapter(this, listOfPhonebook);

            for (MyCaseClass m : All_Static.getMyCaseList())
                adapter.add(new MyCaseClass(m));

            // after fill the adapter.. assign the list to the adapter
            list.setAdapter(adapter);

            list.setOnItemClickListener(new OnItemClickListener() {

                public void onItemClick(AdapterView<?> arg0, View view, int position, long index) {
                    System.out.println("sadsfsf");
                ;
                }
            });
            list.setAdapter(adapter);
        // ========================================================================================

    }



    public void sendSMS(String number, String msg) throws Exception {
        if (!b) {
            SmsManager smsManager = SmsManager.getDefault();
            smsManager.sendTextMessage(number, null, msg, null, null);
        }
        b = true;
    }

    // ========================================================================

}

Are you 100% sure when you pass "this" as the parameter when creating your Adapter that you are passing the Activity?

One good way to check is to modify the app like this:

Add an Activity parameter to your adapter

private Context context;
private Activity parentActivity;
...
public MyCasesListAdapter(Context context, List<MyCaseClass> listPhonebook, Activity parentActivity) {         
    this.context = context;         
    this.listOfCases = listPhonebook; 
    this.parentActivity = parentActivity;    
} 

Create your alert dialog like this...

AlertDialog alertDialog = new AlertDialog.Builder(parentActivity);

Lastly, call the contructor of your adapter like this...

MyCasesListAdapter adapter = new MyCasesListAdapter(this, listOfPhonebook, MyPage.this);   

Explanation: You probably don't need to pass in Activity and Context to your base adapter, but I did this just so you can keep everything else as is for the time being. I'm not sure if "this", when you are instantiating your adapter, is actually an activity. I defined the 3rd parameter in the constructor as "Activity" to force you to pass in an Activity. You'll get compile errors if you try and pass in something that isn't and activity, so it should help you out.

Also, I just noticed, but the problem is probably that your updated code is still trying to create the AlertDialog using MyCasesListAdapter.this as the context, which is not an activity.