对话框中的列表视图/适配器未出现单选按钮布局

Posted

技术标签:

【中文标题】对话框中的列表视图/适配器未出现单选按钮布局【英文标题】:Radio Button layout not appearing with listview/adapter in dialog 【发布时间】:2017-02-14 21:18:51 【问题描述】:

我对 android 还很陌生,但我正在尽我最大的努力来掌握它。我大部分时间都在研究这个问题,我得出的结论是我的实际适配器一定有问题。

不幸的是,当我加载我的对话框时,我没有填充列表视图。

我的目标

我希望出现一个对话框,该对话框是包含列表视图的自定义布局。这已经创建并已被证明可以与其他适配器一起使用。当列表视图出现时,我希望使用单选按钮自动选择一个选项。

自定义对话框 XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:orientation="vertical"
    android:background="@drawable/dialog_main_style">

    <TextView
        android:id="@+id/main_title_dialog"
        android:layout_
        android:layout_
        android:gravity="center"
        android:paddingBottom="12dp"
        android:paddingTop="12dp"
        android:text="Format"
        android:textColor="#020202"
        android:textSize="20sp" />

    <View
        android:id="@+id/dialog_top_divider"
        android:layout_
        android:layout_
        android:layout_below="@+id/main_title_dialog"
        android:layout_marginBottom="12dp"
        android:background="#e4e4e4" />

    <ListView
        android:layout_
        android:layout_
        android:id="@+id/format_choices_list_view"/>

    <TextView
        android:id="@+id/ok_change_name"
        android:layout_
        android:layout_
        android:background="@drawable/dialog_gradient_button"
        android:gravity="center"
        android:layout_below="@id/dialog_top_divider"
        android:padding="16dp"
        android:text="OK"
        android:textColor="#009261"
        android:textStyle="bold" />
</LinearLayout>

这里没什么特别的,只是对我的自定义布局和我的 ListView 的引用。

单选按钮的自定义列表视图

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_
android:layout_>

<RadioButton
    android:layout_
    android:layout_
    android:id="@+id/format_radio_button"
    android:text="mp3"
    android:button="@null"
    android:drawableRight="@android:drawable/btn_radio"
    android:layout_marginRight="16dp"
    android:layout_marginEnd="16dp"
    android:layout_marginLeft="16dp"
    android:layout_marginStart="16dp" />
</LinearLayout>

通常单选按钮需要一个单选按钮组,但由于它是我想使用的自定义布局,我似乎只需要 1 个单选按钮?

创建对话框和适配器

private void showFormatChangeDialog() 
    //TODO get the list view working in the dialog
    Dialog changeFormatDialog = new Dialog(SettingsActivity.this);
    changeFormatDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
    changeFormatDialog.setContentView(R.layout.change_audio_format_dialog);
    changeFormatDialog.getWindow().getAttributes().width = WindowManager.LayoutParams.MATCH_PARENT;

    ListView formatListView = (ListView) changeFormatDialog.findViewById(R.id.format_choices_list_view);

    AudioFormatAdapter adapter = new AudioFormatAdapter(SettingsActivity.this);
    formatListView.setAdapter(adapter);

    changeFormatDialog.show();

我创建了一个对话框并将其设置为我的自定义对话框布局。然后我得到一个对我的列表视图的引用并创建一个适配器并设置它。

格式适配器

public class AudioFormatAdapter extends ArrayAdapter<String> 

    static class ViewHolder 
        RadioButton radioButton;
    

    private String formatNames[] = "mp3", "wav","amr";

    public AudioFormatAdapter(Context c) 
        super(c, 0);
    

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
        View formatView = convertView;
        ViewHolder holder;

        if(formatView == null) 
            formatView = LayoutInflater.from(getContext()).inflate(R.layout.list_view_formats_layout, parent, false);
            holder = new ViewHolder();

            holder.radioButton = (RadioButton) formatView.findViewById(R.id.format_radio_button);
            holder.radioButton.setText(formatNames[position]);

            formatView.setTag(holder);
         else 
            holder = (ViewHolder)formatView.getTag();
        
        return formatView;
    

我的目标是获取对单选按钮的自定义列表视图的引用。我获取单选按钮的引用并根据位置将文本设置为我的数组值。

我似乎没有从这个 ArrayAdapter 获得任何数据,这让我大吃一惊。自从我开始使用以来,我已经使用了几个ArrayAdapter,我还没有遇到过这个问题。当我用另一个适配器替换这个适配器时,它起作用了。我不确定这里有什么问题。

任何帮助将不胜感激。

谢谢。

【问题讨论】:

您可以更好地将列表视图项加载到列表或数组中并填充一个对话框...作为参考,请查看此处androidlift.info/2015/12/28/… 或根据您的要求***.com/questions/15731850/… 谢谢您,我会检查此参考并回复您 不幸的是,从您的第一个链接开始,onPrepareDialog 已被弃用,而另一个则无法正常工作。我很困惑,老实说,我认为问题出在我的适配器上。即使使用文本字段也不会填充。 【参考方案1】:

嗯,它已经解决了我想要的问题,我认为它归结为适配器出现故障。现在我知道我的适配器没有 ViewHolder,但它的选项数量有限,所以现在可以了。

首先我需要一个允许 CheckableLinearLayout 的类。这是一种特殊类型的 LinearLayout,它允许选中和取消选中布局的各个部分。您只需为其创建一个新类,然后将其作为根视图添加到您的 XML 文件中。 com.YOUR-IDENTIFIER-CLASS-NAME-OF-CHECKABLELINEARLAYOUT :) 你可以在下面的链接中看到它!

可检查的线性布局 - 在这里找到 - How do a custom listview item with a radiobutton and single choice

使用该类后,我制作了一个更简单的不同适配器,而且它似乎可以正常工作。

适配器

public class AudioFormatAdapter extends ArrayAdapter<String> 

private ArrayList<String> formats;

public AudioFormatAdapter(Context c)
    super(c, 0);



public AudioFormatAdapter(Context c, ArrayList<String> choices)
    super(c, 0, choices);
    formats = choices;


@Override
public View getView(final int position, final View convertView, ViewGroup parent) 
    View listItemView = convertView;

    listItemView = LayoutInflater.from(getContext()).inflate(R.layout.list_view_formats_layout, parent, false);

    CheckedTextView _radioButton = (CheckedTextView) listItemView.findViewById(R.id.format_radio_button);
    _radioButton.setText(formats.get(position));

    return listItemView;


我们可以看到这个适配器得到一个“CheckedTextView”而不是单选按钮。这样做的原因是我只需要一个带有一些文本的单选按钮样式,这给了我。

我使用我以“格式”传递给适配器的 arrayList 设置文本

最后,我创建了 Dialog 并获得了对我的列表视图的引用。

使用自定义布局创建对话框

private void showFormatChangeDialog(ArrayList<String> formatNames) 
    LayoutInflater inflater = LayoutInflater.from(SettingsActivity.this);
    View dialogLayout = inflater.inflate(R.layout.change_audio_format_dialog, null);
    AlertDialog.Builder builder = new AlertDialog.Builder(SettingsActivity.this);
    builder.setView(dialogLayout);

    final ListView formatListView = (ListView) dialogLayout.findViewById(R.id.format_choices_list_view);
    formatListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
    final AudioFormatAdapter adapter = new AudioFormatAdapter(SettingsActivity.this, formatNames);
    formatListView.setAdapter(adapter);

    AlertDialog customDialog = builder.create();
    customDialog.show();

如果您只想选择其中一个选项,请将模式设置为 SINGLE_CHOICE。我在这里制作适配器并传入一个字符串列表,这些字符串被接受为我的函数的参数。然后创建对话框

结论

这是一个相当烦人的过程,因为我认为我的适配器破坏了大多数东西,我希望我在互联网上的拖钓和找出零碎的东西可以帮助其他人。现在我只需要根据选择的选项来保存和存储数据!

我希望这对某人有所帮助!

【讨论】:

以上是关于对话框中的列表视图/适配器未出现单选按钮布局的主要内容,如果未能解决你的问题,请参考以下文章

如何在 jQuery Mobile 中刷新单选按钮的样式和布局?

当我滚动列表视图单选按钮被自动选择或取消选择无法保持单选按钮的状态

Axure:切换单选按扭,控制界面显示不同内容

自定义单选 ListView

弹出模式对话框后未选中单选按钮?

如何在模糊背景的同时将卡片视图显示为对话