Android 来自 String[] 的简单 ArrayAdapter

Android simple ArrayAdapter from String[]

我可以从 class 结构编写简单的数组适配器,但现在我想从字符串编写简单的数组适配器,在我的应用程序中我有简单的数组:

private String[]  panelNumbers;
panelNumbers = G.getActiveUserInfo().phoneNumbers.split(",");

为了将此数组显示到 Listview,数组项与 RadioButton 合并,我的 xml 布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#ffffff"
    android:orientation="vertical" >

    <RadioButton
        android:id="@+id/radio1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:checkMark="@android:drawable/btn_radio"
        android:gravity="right|center_vertical"
        android:text="xcgdf"
        android:textColor="@color/black_text" />

    <TextView
        android:id="@+id/text1"
        android:layout_width="fill_parent"
        android:layout_height="1dp"
        android:background="@drawable/gradient_divider"
        android:text="Medium Text"
        android:textAppearance="?android:attr/textAppearanceMedium" />

</LinearLayout>

现在我想通过自定义数组适配器填充此数组项,我的 ArrayAdapter 不正确

我的 ArrayAdapter

public class AdapterSmsPanelNumbers extends ArrayAdapter<String[]> {

    public AdapterSlideMenuSMS(String[] array) {
        super(G.context, R.layout.call_list, array);
    }
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = G.inflater.inflate(R.layout.single_choice, parent, false);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.text.setText(array[position]);
        return convertView;
    }

    private static class ViewHolder {
        private final TextView    text;
        private final RadioButton radio;
        public ViewHolder(View view) {
            text = (TextView) view.findViewById(R.id.text1);
            radio = (RadioButton) view.findViewById(R.id.radio1);
        }
    }
}

问题 我无法通过单个 String[] 填充列表视图项目,我不想从 panelNumbers 创建 class,请帮助我解决这个 class 问题,让简单的 ArrayAdapter 显示简单的 Array

首先要理解Adapter的概念。 它需要一个对象数组(或列表),因此对于它在其中找到的每个项目,它将生成一个 View(需要时)。

在这里,如果你想玩 String 的数组,你必须告诉 ArrayAdapter 它会处理 Strings,用 :

public class AdapterSmsPanelNumbers extends ArrayAdapter<String>

ArrayAdapter 已经有一个机制来处理你给他的这些 String。一种方法可以轻松获取提供的数组中的项目:

String stringAtPosition = getItem(position);

所以,正如@SorryForMyEnglish 建议的那样:

public class AdapterSmsPanelNumbers extends ArrayAdapter<String> {

    public AdapterSlideMenuSMS(Context context, String[] array) {
        super(context, 0, array);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.single_choice, parent, false);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.text.setText(getItem(position));
        return convertView;
    }

    private static class ViewHolder {
        private final TextView    text;
        private final RadioButton radio;
        public ViewHolder(View view) {
            text = (TextView) view.findViewById(R.id.text1);
            radio = (RadioButton) view.findViewById(R.id.radio1);
        }
    }
}

然后在你的 Activity 中,你可以使用这个自定义 ArrayAdapter :

private String[]  panelNumbers;
panelNumbers = G.getActiveUserInfo().phoneNumbers.split(",");

ArrayAdapter adapter = new AdapterSmsPanelNumbers(this, panelNumbers);
listView.setAdapter(adapter);

对于看到问题并且只想知道如何从以编程方式创建的字符串列表而不是字符串资源创建数组适配器的人,您只需要做

String[] myStringArray = (String[]) myArrayListOfStrings.toArray();
ArrayAdapter<CharSequence> myAdapter = new ArrayAdapter(getContext(), R.layout.my_layout, myStringArray);