Вопрос по listview, android, java, android-alertdialog – Как заставить BaseAdapter показывать приложение AlertDialog для Android

2

Как я могу сделать кнопку в BaseAdapter в listView показывает alertDialog, я пытался, но он остановил работу неожиданно (RunTime Error), мой код показан ниже.

любое предложение

заранее спасибо

Monerah

==== после обновления =====================

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






}
</code>

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

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

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

}
</code>
Вы получили ответ? KickingLettuce

Ваш Ответ

4   ответа
8

когда проходите «это»? в качестве параметра при создании вашего адаптера, что вы передаете активность?

Один хороший способ проверить это изменить приложение следующим образом:

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

Объяснение: Вам, вероятно, не нужно передавать Activity и Context своему базовому адаптеру, но я сделал это только для того, чтобы вы могли пока оставить все остальное как есть. Я не уверен, является ли "это", когда вы создаете экземпляр своего адаптера, на самом деле действием. Я определил третий параметр в конструкторе как & quot; Activity & quot; чтобы заставить вас пройти в деятельности. Вы получите ошибки компиляции, если попытаетесь передать что-то, что не является активным, так что это должно помочь вам.

Кроме того, я только что заметил, но проблема, вероятно, в том, что ваш обновленный код все еще пытается создать AlertDialog, используя MyCasesListAdapter.this в качестве контекста, который не является действием.

5
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(view.getRootView().getContext());
    alertDialogBuilder.setMessage("Are you sure you want to delete?");
    alertDialogBuilder.setPositiveButton("Ok",
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface arg0, int arg1) {
                    deleteExp(tid);
                }
            });

    alertDialogBuilder.setNegativeButton("cancel",
            new DialogInterface.OnClickListener() {

                @Override
                public void onClick(DialogInterface arg0, int arg1) {

                }
            });

    AlertDialog alertDialog = alertDialogBuilder.create();
    alertDialog.show();
0

AlertDialog.Builder построитьAler,tDialog.

Посмотрите на образецAlertDialogSamples.java
AlertDialog alertDialog = new AlertDialog.Builder (context); Я сделал это, есть синтаксическая ошибка Monerah
1

alertDialog даже не инициализируется .. поэтому NPE .. и когда вы создаете его внутри адаптера, убедитесь, что используетеactivity context and not ApplciatioContext

AlertDialog alertDialog = new AlertDialog.Builder(YourACtivity.this);

вышеприведенная строка не должна быть на уровне класса .. она должна быть внутриgetView() метод ... и использовать ваш экземпляр активности в качестве контекста .. что-то вродеnameOfYourActivity.this

ок плохо посмотрю мое обновление плз Monerah
AlertDialog alertDialog = new AlertDialog.Builder (context); Я сделал это, есть синтаксическая ошибка !!! Monerah
@ Монера .. покажи этот код тоже ... и прими несколько ответов ..
@Monerah .. посмотрите наstackoverflow.com/questions/5292451/…
спасибо за твой ответ Monerah

Похожие вопросы