Проблема поддержки ListFragment

В настоящее время я использую ListFragment вместе с ExpandableListView, чтобы показать некоторые данные, поддерживаемые SimpleCursorTreeAdapter. Все работает нормально, но недавно я переключился на пакет support.v4, чтобы использовать класс ViewPager для пролистывания вкладок. Пролистывание и все остальные классы, которые теперь используют support.v4.Fragment, работают нормально, но мой ListFragment перестал работать.

Никаких исключений не возникает, но ListFragment просто не показывает никаких элементов.

Это код для ListFragment:

public class VisuTextFragment extends ListFragment {

    private Storage mStorage;
    private int mFilterSensortype;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mStorage = Storage.newSQLiteDatabase(getActivity());
        mFilterSensortype = -1;
        setHasOptionsMenu(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
        return inflater.inflate(R.layout.l_visu_text, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        fillData();
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        super.onCreateOptionsMenu(menu, inflater);
        inflater.inflate(R.menu.textvis, menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.menu_filter:
            final Dialog dialog = new Dialog(getActivity());
            dialog.setTitle("Filter by sensor type");
            dialog.setContentView(R.layout.l_dialog_filter);

            Button ok = (Button) dialog.findViewById(R.id.filter_ok);
            ok.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                int filter = Integer.parseInt(((EditText) dialog.findViewById(R.id.et_filter)).getText().toString());
                    mFilterSensortype = filter;
                    fillData();
                    dialog.dismiss();
                }
            });

            Button cancel = (Button) dialog.findViewById(R.id.filter_cancel);
            cancel.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    dialog.cancel();
                }
            });

            dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
            dialog.show();
            break;
        }
        return true;
    }

    @Override
    public void onResume() {
        super.onResume();
        fillData();
    }

    public void fillData() {
        Log.d("VisuTextFragment", "fillData()");
        Cursor cursor;
        if (mFilterSensortype == -1)
            cursor = mStorage.queryAllAsCursor();
        else
            cursor = mStorage.query(mFilterSensortype);

        TextVisCursorAdapter adapter = new TextVisCursorAdapter(
                getActivity(),
                cursor,
                R.layout.l_visu_text_group,
                new String[] { Storage.ELEMENT_ID, Storage.ELEMENT_ENTRIES_DATE, Storage.ELEMENT_ENTRIES_LATITUDE, Storage.ELEMENT_ENTRIES_LONGITUDE, Storage.ELEMENT_ENTRIES_SENSORTYPE },
                new int[] { R.id.id, R.id.date, R.id.latitude, R.id.longitude, R.id.sensortype },
                R.layout.l_visu_text_child,
                new String[] { Storage.ELEMENT_MEASUREMENTS_VALUE },
                new int[] { R.id.value });

        ListView lv = (ListView) getListView();
        ExpandableListView elv = (ExpandableListView) lv;
        elv.setGroupIndicator(null);
        elv.setAdapter(adapter);
    }
}

И это макет, который я использую (не знаю, поможет ли это):

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="@string/id"/>
    <TextView
        android:gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:text="@string/date"/>
    <TextView
        android:gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:text="@string/latitude"/>
    <TextView
        android:gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:text="@string/longitude"/>
    <TextView
        android:gravity="center"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="@string/sensortype"/>
</LinearLayout>
<LinearLayout 
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ExpandableListView android:id="@+id/android:list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:transcriptMode="normal"/>
    <TextView android:id="@+id/android:empty"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/no_entries"/>

</LinearLayout>
</LinearLayout>

Просто к вашему сведению: TextView в файле макета отображаются, но сам список просто отсутствует. Даже TextView для пустого списка не отображается.

Надеюсь, вы можете помочь.

РЕДАКТИРОВАТЬ: я проверил ширину и высоту ExpandableListView с помощью соответствующих методов, и оба возвращают значение 0. Его метод getCount() возвращает 347. Таким образом, представление определенно существует и заполнено правильно, но по какой-то странной причине оно просто не обращается к экран.

EDIT2: Хорошо, я исправил проблему. Проблема заключалась в том, что LinearLayout, в котором размещался TextViews поверх фактического списка, имел атрибут layout_height, установленный на fill_parent, что, как ни странно, не было проблемой для версии без поддержки, а также для композитора в eclipse, поскольку они оба работали таким образом и Я даже не заметил, что он был установлен на fill_parent.




Ответы (3)


getListView() в ListFragment специально ищет идентификатор просмотра списка @id/android:list. Я не уверен, что добавление «+» туда, как вы, имело бы эффект или нет, но это первое, что я бы попробовал.

Вы также заметили, что переключились на библиотеку поддержки... вы переключили все соответствующие вызовы методов? Например, вместо getFragmentManager вам нужно будет использовать getSupportFragmentManager, а вместо Activity для управления фрагментами вам нужно будет использовать FragmentActivity и т. д.

person Barak    schedule 22.09.2012
comment
Да, я переключился на FragmentActivity. Я также удалил все импорты и повторно импортировал их, чтобы посмотреть, есть ли какой-либо класс поддержки, который я мог бы использовать вместо обычных. Честно говоря, я не думаю, что это как-то связано с идентификатором ListView. Я пробовал любой возможный способ написать это, и все дает мне ту же проблему. - person minh; 22.09.2012

Я думаю, что лучше использовать android:id="@android:id/list" вместо android:id="@+id/android:list", кроме того, в вашем случае действительно бесполезно расширять ListFragment, просто используйте Фрагментируйте и используйте findViewById для вашего расширяемого списка.

Вы можете изменить:

@Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

    }

to:

public void onActivityCreated(Bundle aSavedInstanceState) {

        super.onActivityCreated(aSavedInstanceState);
fillData();
    }

убедитесь, что ваш метод fillData вызывается.

person Anis BEN NSIR    schedule 22.09.2012
comment
Да, я использовал @android:id/list раньше, а затем увидел @+id/android:list где-то еще и попробовал, чтобы увидеть, имеет ли это какое-то значение. Я все еще использую ListFragment, поэтому он автоматически переключается между самим списком и пустым представлением, если данных нет. - person minh; 22.09.2012
comment
Просто чтобы убедиться, что я расширил Fragment вместо ListFragment, но проблема все еще существует. - person minh; 22.09.2012
comment
Вы можете подтвердить, что видите @string/no_entries, на самом деле вы используете fill_parent в первом LinearLayout? - person Anis BEN NSIR; 24.09.2012
comment
Посмотрите на редактирование, уже исправили проблему. Действительно, проблема была в fill_parent. Спасибо за помощь в любом случае! - person minh; 25.09.2012

Хорошо, я исправил проблему. Проблема заключалась в том, что LinearLayout, который размещал TextViews поверх фактического списка, имел атрибут layout_height, установленный на fill_parent, что, как ни странно, не было проблемой для версии без поддержки, а также для композитора в eclipse, поскольку они оба работали таким образом и Я даже не заметил, что он был установлен на fill_parent.

person minh    schedule 25.09.2012