1

我目前正在使用 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。所以 View 肯定存在并且被正确填充,但由于某些奇怪的原因,它没有被绘制到屏幕。

EDIT2:好的,我解决了这个问题。问题是LinearLayout托管在TextViews实际列表顶部的layout_height属性设置为fill_parent,这对于不支持的版本以及 eclipse 中的作曲家来说奇怪的是没有问题,因为它们都以这种方式工作而我没有甚至注意到它被设置为fill_parent.

4

3 回答 3

0

好的,我解决了问题。问题是在实际列表顶部托管 TextViews 的 LinearLayout 将其 layout_height 属性设置为 fill_parent,奇怪的是,这对于不支持的版本以及 eclipse 中的作曲家来说都没有问题,因为它们都以这种方式工作并且我什至没有注意到它被设置为fill_parent。

于 2012-09-25T11:21:47.287 回答
0

getListView()在 aListFragment中是专门寻找一个 listview id 的@id/android:list。我不确定像您那样在其中添加“+”是否会产生影响,但这是我会尝试的第一件事。

您还注意到您切换到支持库...您是否切换了所有适当的方法调用?例如,getFragmentManager您不需要使用getSupportFragmentManagerand 而不是使用 anActivity来控制片段,而是需要使用FragmentActivity等。

于 2012-09-22T14:07:27.197 回答
0

我认为使用 android:id="@android:id/list" 而不是 android:id="@+id/android:list" 是黄油,而且,在你的情况下,扩展 ListFragment 真的没用,只需使用为您的可扩展列表分段并使用 findViewById。

你能改变:

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

    }

至:

public void onActivityCreated(Bundle aSavedInstanceState) {

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

确保调用了您的 fillData 方法。

于 2012-09-22T13:38:25.003 回答