ListView没有显示在我的应用上

时间:2017-04-12 19:34:47

标签: java android android-layout listview

我创建了一个连接到列表视图的片段,以显示一个简单的表视图。

这是我的片段:

public class ConfRoomListFragment extends Fragment {
    ApplicationController activity;
    String[] mobileArray = {"Android","IPhone","WindowsMobile","Blackberry",
            "WebOS","Ubuntu","Windows7","Max OS X"};
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_conf_room_list, container, false);
        activity = (ApplicationController) getActivity();
        ArrayAdapter adapter = new ArrayAdapter<String>(getActivity(),
                R.layout.activity_listview, mobileArray);

        ListView listView = (ListView)view.findViewById(R.id.conf_room_directory);
        listView.setAdapter(adapter);

        return view;
    }
}

这是我的fragment_conf_room_list.xml

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

    <ListView
        android:id="@+id/conf_room_directory"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>

这是我的activity_listview.xml

<?xml version="1.0" encoding="utf-8"?>
<!--  Single List Item Design -->

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/label"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dip"
    android:textSize="16dip"
    android:textStyle="bold" >
</TextView>

当我运行我的应用时,所有显示的都是空白屏幕。我创建了列表视图并添加了适配器。似乎没有任何变量问题,所以我不确定问题是什么。

修改 我已将我的片段添加到活动中: ApplicationController.java

/* Instantiate all Fragments needed*/
    directoryViewFragment = new DirectoryViewFragment();
    directoryListFragment = new DirectoryListFragment();
    officeViewFragment = new OfficeViewFragment();
    officeListFragment = new OfficeListFragment();
    confRoomListFragment = new ConfRoomListFragment();
    settingsFragment = new SettingsFragment();
    directionsFragment = new DirectionsFragment();
    airportInfoFragment = new AirportInfoFragment();
    publicationsFragment = new PublicationsFragment();
    practiceGroupListFragment = new PracticeGroupListFragment();
    practiceGroupFragment = new PracticeGroupFragment();

如你所见,我实例化了我的片段。

这是选择的地方:

private class SlideMenuClickListener implements ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
                            long id) {
        // display view for selected nav drawer item
        displayView(position, false);
        System.out.println(position);
        current_position = position;
        invalidateOptionsMenu();
    }
}

/**
 * Diplaying fragment view for selected nav drawer list item
 */
private void displayView(int position, boolean firstClick) {
    // update the main content by replacing fragments
    if (firstClick) {
        Fragment fragment = directoryViewFragment;
        currentPanel = Panel.HomeView;
        getFragmentManager().beginTransaction()
                .replace(R.id.fragmentHolder, fragment)
                .addToBackStack(null)
                .commit();
        getFragmentManager().executePendingTransactions();
    } else {
        new ViewSelectionListener(this).onItemClick(null, null, position, 0);
    }

    // update selected item and title, then close the drawer
    setTitle(navMenuTitles[position]);
    drawerLayout.closeDrawer(navList);
}

我知道它有效,因为setTitle函数有效,片段标题为Conference Rooms

这是我的ViewSelectionListener.java,我在其中更新片段管理器以显示我的片段:

    } else if (position == 2) {

        //Conference Rooms
        activity.setCurrentPanel(Panel.ConfRoomDirectory);
        FragmentTransaction transaction = activity.getFragmentManager().beginTransaction()
                .setCustomAnimations(Tags.TRANSITION_IN, Tags.TRANSITION_OUT)
                // TODO If there are other fragments to hide, put them here!
                .hide(activity.getDirectoryViewFragment())
                .hide(activity.getPublicationsFragment())
                .hide(activity.getSettingsFragment())
                .hide(activity.getAirportInfoFragment())
                .hide(activity.getDirectionsFragment())
                .hide(activity.getPracticeGroupListFragment())
                .hide(activity.getPracticeGroupFragment())
                .hide(activity.getOfficeViewFragment())
                .show(activity.getConfRoomListFragment());

        if (activity.isPhone) {
            transaction.hide(activity.getDirectoryListFragment());
            transaction.hide(activity.getOfficeListFragment());
        } else if (activity.isPortrait()) {
            transaction.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_out_left);
            if (DirectoryViewFragment.leftPanelIsShowing) {
                transaction.remove(activity.getDirectoryListFragment());
                DirectoryViewFragment.leftPanelIsShowing = false;
            }
            if (OfficeViewFragment.leftPanelIsShowing) {
                transaction.remove(activity.getOfficeListFragment());
                OfficeViewFragment.leftPanelIsShowing = false;
            }
            if (PracticeGroupFragment.leftPanelIsShowing) {
                transaction.remove(activity.getPracticeGroupListFragment());
                PracticeGroupFragment.leftPanelIsShowing = false;
            }
        }
        transaction.commit();
    }

如您所见,我隐藏了所有其他片段并显示了我想要的片段。但是,只有标题得到更新,片段才会显示。所以问题并不在于活动,还有其他一些我不知道的错误。

3 个答案:

答案 0 :(得分:0)

activity = (ApplicationController) getActivity();

删除上面的行,此行永远不会在此片段中使用。

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
     View view = inflater.inflate(R.layout.fragment_conf_room_list, container, false);

     ArrayAdapter adapter = new ArrayAdapter<String>(getActivity(),
                android.R.layout.simple_list_item_1, mobileArray);

     ListView listView = (ListView)view.findViewById(R.id.conf_room_directory);
     listView.setAdapter(adapter);

     return view;
}
  

fragment_conf_room_list.xml

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

   <ListView
       android:id="@+id/conf_room_directory"
       android:layout_width="match_parent"
       android:layout_height="match_parent" >
   </ListView>

</LinearLayout>

答案 1 :(得分:0)

检查片段的onCreateView()方法是否真正被调用。如果没有,那么您的片段不会添加到活动中。请务必致电

getFragmentManager().beginTransaction() .add(R.id.fragmentHolder, ConfRoomListFragment) .addToBackStack(null) .commit(); 

在调用FragmentTransaction的show(ConfRoomListFragment)方法之前。

如果调用ConfRoomListFragment的onCreate()方法,请尝试使用ArrayAdapter的下一个构造函数:

ArrayAdapter adapter =  = new ArrayAdapter<>(getContext(), R.layout.activity_listview, mobileArray);

稍微更改列表项(activity_listview.xml):

<?xml version="1.0" encoding="utf-8"?>
<!--  Single List Item Design -->

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dip"
    android:textSize="16sp"
    android:textStyle="bold" >
</TextView>

答案 2 :(得分:0)

如果要使用自己的布局,则需要在适配器中指定TextView布局。

public class ConfRoomListFragment extends Fragment {
    ApplicationController activity;
    String[] mobileArray = {"Android","IPhone","WindowsMobile","Blackberry",
        "WebOS","Ubuntu","Windows7","Max OS X"};
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_conf_room_list, container, false);
        activity = (ApplicationController) getActivity();
        ArrayAdapter adapter = new ArrayAdapter<String>(getActivity(),
            R.layout.activity_listview, R.id.label, mobileArray);

        ListView listView = (ListView)view.findViewById(R.id.conf_room_directory);
        listView.setAdapter(adapter);

        return view;
    }
}

并且您的ListView身高必须设为match_parent

<ListView
    android:id="@+id/conf_room_directory"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >
</ListView>