Как настроить элементы списка в Android AlertDialog

Я хочу показать несколько строк с разными стилями текста для каждого элемента в списке с помощью AlertDialog, но не могу указать ни одного примера.

Кто-нибудь знает, как настроить элементы AlertDialog? Или мне действительно нужно создать Activity с ListView для этого?


person infero    schedule 29.08.2010    source источник


Ответы (2)


Используйте setAdapter() на AlertDialog.Builder, чтобы предоставить свой собственный ListAdapter для вашего списка.

person CommonsWare    schedule 29.08.2010

edit: кстати, я внес некоторые изменения, чтобы отображать разные значки:

list_item.xml:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/icon"
        android:contentDescription="@string/icon_descr"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:layout_gravity="left" />

    <TextView
        android:id="@+id/title"
        android:text=""
        android:paddingLeft="10dip"
        android:layout_gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

И в вашу деятельность:

// dialog list entries
final String[] items = {
    getString(R.string.entry_0),
    getString(R.string.entry_1),
    getString(R.string.entry_2)
};

// dialog list icons: some examples here
final int[] icons = {
    android.R.drawable.ic_menu_edit,
    android.R.drawable.ic_menu_send,
    android.R.drawable.ic_menu_delete
};

ListAdapter adapter = new ArrayAdapter<String>(
    getApplicationContext(), R.layout.list_item, items) {

    ViewHolder holder;

    class ViewHolder {
        ImageView icon;
        TextView title;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
    final LayoutInflater inflater = (LayoutInflater) getApplicationContext()
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    if (convertView == null) {
        convertView = inflater.inflate(
        R.layout.list_item, null);

        holder = new ViewHolder();
        holder.icon = (ImageView) convertView
        .findViewById(R.id.icon);
        holder.title = (TextView) convertView
        .findViewById(R.id.title);
        convertView.setTag(holder);
    } else {
        // view already defined, retrieve view holder
        holder = (ViewHolder) convertView.getTag();
    }     

    holder.title.setText(items[position]);

    holder.icon.setImageResource(icons[position]);
    return convertView;
    }
};

// ----------

AlertDialog.Builder builder = new AlertDialog.Builder(myActivity.this);

builder.setTitle("title");

builder.setAdapter(adapter, new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int which) {
        // ---
    }

});

builder.create();
if (! ((Activity) myActivity.this).isFinishing()) {
    builder.show();
}
person dentex    schedule 21.06.2013
comment
это дает мне ошибку IllegalStateException: System services not available to Activities before onCreate - person mrid; 06.10.2017