我对Android很新,但我正在尽最大努力去处理它。我一天中大部分时间都在研究这个问题,并且我得出的结论是我的实际适配器一定存在问题。
不幸的是,当我加载对话框时,我没有填写列表视图。
我希望显示一个包含listview的自定义布局的对话框。这已创建并已证明可与其他适配器一起使用。当列表视图出现时,我希望使用单选按钮自动选择一个选项。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/dialog_main_style">
<TextView
android:id="@+id/main_title_dialog"
android:layout_width="match_parent"
android:layout_height="wrap_content"
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_width="match_parent"
android:layout_height="1dp"
android:layout_below="@+id/main_title_dialog"
android:layout_marginBottom="12dp"
android:background="#e4e4e4" />
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/format_choices_list_view"/>
<TextView
android:id="@+id/ok_change_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
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_width="match_parent"
android:layout_height="match_parent">
<RadioButton
android:layout_width="match_parent"
android:layout_height="wrap_content"
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>
通常单选按钮需要一个广播组,但由于它是我想要使用的自定义布局,我似乎只需要一个单选按钮?
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
并且我没有遇到过这个问题。当我用不同的适配器替换这个适配器时,它工作了。我不确定这里的问题是什么。
非常感谢任何帮助。
谢谢。
答案 0 :(得分:0)
它已修复我想要的东西,我认为它归结为适配器失败。现在我知道我的适配器没有ViewHolder,但它有一定数量的选项,所以它现在还可以。
首先,我需要一个允许CheckableLinearLayout的类。这是一种特殊类型的LinearLayout,它允许检查和取消选中布局的各个部分。您只需创建一个新类,然后将其作为rootview添加到XML文件中。 com.YOUR-IDENTIFIER-CLASS-OF-CHECKABLELINEARLAYOUT :)你可以在下面的链接中看到它!
使用该类后,我制作了一个更简单的不同适配器,它似乎工作。
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;
}
}
正如我们所看到的,这个适配器获得了一个&#34; CheckedTextView&#34;而不是单选按钮。这样做的原因是我只需要一个带有一些文字的单选按钮样式,这就是我的意思。
我使用arrayList设置文本,然后传递给适配器&#34;格式&#34;
最后,我创建了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。我在这里制作适配器并传入一个字符串列表,这些字符串被接受为我的函数的参数。然后创建对话框
这是一个相当令人恼火的过程,因为我认为我的适配器打破了大多数事情,我希望我在互联网上徘徊,找出点点滴滴可以帮助别人。现在我只需要根据选择的选项保存和存储数据!
我希望这有助于某人!