1

目前我使用的是ListFragment連同ExpandableListView顯示由SimpleCursorTreeAdapter支持的一些數據。一切正常,但我最近切換到support.v4包,使用ViewPager類在標籤之間滑動。滑動和所有其他類現在使用support.v4.Fragment工作正常,但我的ListFragment已停止工作。支持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:好的,我解決了這一問題。問題是,該託管在實際列表頂部的TextViewsLinearLayout有其layout_height屬性設置爲fill_parent,這奇怪的是對於非支持版本的任何問題以及Eclipse中的作曲家,因爲它們都工作這種方式和我甚至沒有注意到它被設置爲fill_parent

回答

0

我認爲它的黃油使用Android:不是: 「ID /列表@機器人」 機器人:ID = ID = 「@ + ID /安卓名單」 同樣的,在你的情況下,其真沒用延長ListFragment,只需使用Fragment並將findViewById用於expandableList。

您可以更改:

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

    } 

到:

public void onActivityCreated(Bundle aSavedInstanceState) { 

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

確保您fillData方法被調用。

+0

是的,我之前使用了@android:id/list,然後看到了@ + id/android:list在其他地方,並試圖看看它是否有所作爲。我仍然使用ListFragment,因此如果沒有數據,它會自動在列表本身和「空白」視圖之間切換。 – minh

+0

只是爲了確保我從片段擴展而不是ListFragment,但問題仍然存在。 – minh

+0

你能確認你正在看到@ string/no_entries,實際上你在第一個LinearLayout中使用fill_parent嗎? –

0

getListView() in ListFragment正在尋找一個列表視圖ID爲@id/android:list。我不確定像你那樣在那裏加入「+」是否會起作用,但這是我第一次嘗試。

你也注意您切換到支持庫...你切換所有適當的方法調用?例如,而不是getFragmentManager你將需要使用getSupportFragmentManager和而不是使用Activity控制片段,你需要使用FragmentActivity

+0

是的,我切換到'FragmentActivity'。我還刪除了所有導入並重新導入它們,以查看是否有任何支持類可以使用,而不是常規支持類。說實話,我不認爲它與ListView的id有關。我試過任何可能的方式來寫它,一切都給了我同樣的問題。 – minh

0

好吧,我解決了這一問題。問題是,在實際列表頂部託管TextView的LinearLayout將其layout_height屬性設置爲fill_parent,對於非支持版本以及eclipse中的作曲者來說,這很奇怪,因爲它們都以這種方式工作,我甚至沒有注意到它被設置爲fill_parent。