Создание и отображение AlertDialog из пользовательского ListAdapter - PullRequest
3 голосов
/ 14 марта 2011

Я реализую собственный ListAdapter, который использует разные макеты элементов списка для отображения некоторых элементов.Из этого пользовательского ListAdapter я на самом деле хочу показать AlertDialog при нажатии определенной кнопки.Я реализовал метод onCreateDialog (int) и пытаюсь использовать showDialog (int) для отображения диалога.Но диалоговое окно не отображается в Activity.

Вот мой пользовательский файл listadapter


import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
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 AddProblemsLayoutAdapter extends BaseAdapter {

    private Activity mContext;
    private static final int TYPE_TITLE = 0;
    private static final int TYPE_TAG = 1;
    private static final int TYPE_SOLUTION = 2;
    private static final int LAYOUT_MAX_COUNT = TYPE_SOLUTION + 1;
    private static final int ADD_TAG_DIALOG = 3378;
    private static int ITEM_COUNT = 4;
    private static Button addSolution = null, addTag = null;
private Activity mContext;
private static final int TYPE_TITLE = 0;
private static final int TYPE_TAG = 1;
private static final int TYPE_SOLUTION = 2;
private static final int LAYOUT_MAX_COUNT = TYPE_SOLUTION + 1;
private static final int ADD_TAG_DIALOG = 3378;
private static int ITEM_COUNT = 4;
private static Button addSolution = null, addTag = null;


public AddProblemsLayoutAdapter(Activity aContext) {

    mContext = aContext;
}

@Override
public int getViewTypeCount() {
    return LAYOUT_MAX_COUNT;
}

protected Dialog onCreateDialog(int id) {
    AlertDialog dialog = null;
    AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
    switch (id) {
    case ADD_TAG_DIALOG:
        builder.setMessage("Are you sure you want to exit?").setCancelable(
                false).setPositiveButton("Yes",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                    }
                }).setNegativeButton("No",
                new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        dialog.cancel();
                    }
                });

        dialog = builder.create();
        break;
    default:
        dialog = null;
    }
    dialog.setOwnerActivity(mContext);
    return dialog;
}

@Override
public int getItemViewType(int position) {
    if (position < 2)
        return TYPE_TITLE;
    else
        return position > 2 ? TYPE_SOLUTION : TYPE_TAG;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    int type = getItemViewType(position);
    if (convertView == null) {
        LayoutInflater inflater = mContext.getLayoutInflater();
        switch (type) {
        case TYPE_TITLE:
            convertView = inflater.inflate(R.layout.title_row, null);
            break;

        case TYPE_TAG:
            convertView = inflater.inflate(R.layout.tag_row, null);
            break;
        case TYPE_SOLUTION:
            convertView = inflater.inflate(R.layout.solution_row, null);
            break;
        }
    }
    if (position == 0) {
        TextView titleText = (TextView) convertView
                .findViewById(R.id.titleText);
        titleText.setText(R.string.title_string);
    } else if (position == 1) {
        TextView titleText = (TextView) convertView
                .findViewById(R.id.titleText);
        titleText.setText(R.string.description_string);
    } else if (position == 2) {
        addTag = (Button) convertView.findViewById(R.id.addProblemTag);
        addTag.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                mContext.showDialog(ADD_TAG_DIALOG);
                Toast.makeText(mContext, "Add Tags", Toast.LENGTH_LONG)
                        .show();
            }
        });

    } else if (position == 3) {
        addSolution = (Button) convertView.findViewById(R.id.addSolution);
        addSolution.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                ITEM_COUNT++;
                notifyDataSetChanged();
            }
        });
    }
    return convertView;
}

@Override
public int getCount() {
    return ITEM_COUNT;
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return 0;
}

}

Может кто-нибудь дать мне несколько советов относительнокак показать окно AlertDialog при нажатии кнопки.

Ответы [ 4 ]

4 голосов
/ 14 марта 2011

Если вы используете контекст для вызова showDialog, вы, вероятно, захотите определить диалог onCreateDialog в вашем Activity, а не в вашем адаптере.

1 голос
/ 14 марта 2011

Не работает, потому что onCreateDialog принадлежит классу Activity.Вы не должны ничего делать в адаптере, а управлять данными.Тем не менее, поместите onCreateDialog в свою деятельность и вызовите ее оттуда (конечно, используя метод showDialog).

Вы добавили прослушиватель щелчков к одной из кнопок;поэтому вы хотите отправить обратный вызов в действия, чтобы он вызвал метод showDialog.

0 голосов
/ 27 февраля 2016

В классе CustomAdapter вы объявляете переменную mContext и данные ArrayList для ListView

ArrayList<String> datasource;
Context mContext;

Создать конструктор:

 public AdapterAudio(Context mContext, ArrayList<String> data) {
    super();
    this.datasoure = data;
    this.mContext = mContext;
}

Когда вы вызываете CustomAdapter из Activity, «Activity_Main.this» - это контекст, который вам нужен

CustomAdapter adapter = new CustomAdapter(Activity_Main.this, listAudio_hienthi10);

Теперь у вас есть контекст, объявлена ​​переменная mContext для замены

"getContext()", "v.getContext()"

Теперь вы можете добавить тост или отобразить любое диалоговое окно, нажав кнопку Button в пользовательском адаптере. Наслаждайтесь вашим кодом!

0 голосов
/ 23 августа 2015

Вы можете использовать MaterialDesignLibrary.Который также будет работать с BaseAdapters и ListAdapters.пожалуйста, проверьте это здесь https://github.com/navasmdc/MaterialDesignLibrary

...