Android PreferenceFragment ListView ArrayAdapter GetView не вызывается

После изучения/просмотра кода за последние пару дней решение ускользает от меня. Функция ArrayAdapter.getView() не вызывается.

ArrayAdapter.getCount() возвращает 3.

Это представление списка похоже на фрагмент настроек WiFi. WifiSettings.java" rel="nofollow">https://android.googlesource.com/platform/packages/apps/Settings.git/+/6829c48c36fceebb46989f8ee25c369fa5f7adeb/src/com/android/settings/wifi/WifiSettings.java

Примеры кода на GitHub (с использованием условий поиска по заголовку) показывают, что это должно работать.

Запросы через stackoverflow для «getView не вызывается» предположили, что

  • Список не передавался,
  • счет не возвращался,
  • ArrayAdapter не был правильно подключен к ListView с помощью setListAdapter vs setAdapter
  • область действия ArrayAdapter и ListView должна быть на уровне класса и метода
  • ListView может быть невидимым, поэтому Android знает, что не сможет отобразить его на экране, поэтому метод getView() никогда не вызывается для рендеринга объектов.

Ниже представлены классы PreferenceFragment и ArrayAdapter, а также файлы XML.

Твои мысли?

Класс PreferenceFragment

public class Settings_WebServers extends PreferenceFragment
{

protected MyAdapter adapter = null;
protected ListView lv = null;

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate (savedInstanceState);
    addPreferencesFromResource(R.xml.settings_webservers);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
    super.onCreateView (inflater, container, savedInstanceState);

    View v = inflater.inflate (R.layout.webservers, container, false);

    List<String> strings = new ArrayList<String> ();
    strings.add ("WebServer 1");
    strings.add ("WebServer 2");
    strings.add ("WebServer 3");

    adapter = new MyAdapter (container.getContext(), R.layout.webservers_list, strings);

    lv = (ListView) v.findViewById (android.R.id.list);

    lv.setAdapter (adapter);

    return v;
}

@Override
public void onStart()
{
    super.onStart();;
    Log.d ("onStart ", "Entered Function" );
    Log.d ("ListView ", String.valueOf(lv.isShown()?"shown":"hidden"));
}

// ArrayAdapter embedded class

Класс ArrayAdapter

private class MyAdapter extends ArrayAdapter<String>
{
    Context context;
    List<String> strings = new ArrayList<String>();
    int layoutResourceId;

    public MyAdapter(Context context, int layoutResourceId, List<String> objects)
    {
        super(context, layoutResourceId, objects);

        this.layoutResourceId = layoutResourceId;
        this.strings = objects;
        this.context = context;
    }

    @Override
    public int getCount ()
    { return (strings.size()); }

    @Override
    public View getView (int position, View convertView, ViewGroup parent)
    {
        Log.d ("getView position", String.valueOf (position) );

        TextView lblServerName = null;

        String current = strings.get (position);

        LayoutInflater inflater = 
            (LayoutInflater) context.getSystemService 
            (Context.LAYOUT_INFLATER_SERVICE);

        convertView = inflater.inflate 
            (R.layout.webservers_list, parent, false);


        lblServerName = (TextView) convertView.findViewById (R.id.txtServerName);
        if (lblServerName != null)
            lblServerName.setText (String.valueOf(current));

        return convertView;
    }       
}
}

Предпочтительный сегмент заголовка

<header
    android:fragment="ENetArch.Todo.Settings_WebServers"
    android:icon="@drawable/icon_server"
    android:title="WebServers"
    android:summary="A list of servers to synchronize with"/>

xml.settings.webservers.xml

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

</PreferenceScreen>

layout.webservers.xml

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

<ListView
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
     />

</LinearLayout>

layout.webservers_list.xml

<?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="?android:attr/listPreferredItemHeight"
    android:padding="6dip">

    <TextView
        android:id="@+id/txtServerName"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:layout_width="match_parent"
        android:text="ENetArch"
        />

</LinearLayout>

Отслеживание журнала

04-25 15:33:02.840: D/onCreateView(2941): функция введена

04-25 15:33:02.930: D/MyAdapter(2941): введена конструкция

04-25 15:33:02.930: D/MyAdapter(2941): завершение конструкции

04-25 15:33:02.950: D/getCount(2941): 3

04-25 15:33:02.950: D/getCount(2941): 3

04-25 15:33:02.950: D/onCreateView(2941): выход из функции

04-25 15:33:03.070: D/onStart(2941): функция введена

04–25 15:33:03.070: D/ListView(2941): скрыто


person E Net Arch    schedule 25.04.2014    source источник
comment
Учитывая последнюю возможную причину, по которой ArrayAdapter.getView не вызывается, я добавил границу в ListView, используя [ссылка] (stackoverflow.com/questions/5065722/). Появилась красная рамка, заполнила экран, а содержимое не появилось.   -  person E Net Arch    schedule 25.04.2014
comment
добавлен следующий код: ` @Override public void onStart() { super.onStart();; Log.d (onStart, введенная функция); Log.d(ListView, String.valueOf(lv.isShown()?показано:скрыто)); } `   -  person E Net Arch    schedule 25.04.2014
comment
Создал новую активность WebServersActivity из приведенного выше кода, единственное, что действительно изменилось, это setContentView (R.layout.webservers);. Отобразилась активность, и мои 3 строки появились так, как должны были. Очень странно, что это за ошибка. знак равно   -  person E Net Arch    schedule 26.04.2014