Question

How can you combine a ListFragment with normal Fragments? My application works if I use just Fragments, but if I change one of the Fragments into a ListFragment the application stops when I run it even though there are no errors given.

My FragmentActivity:

     package com.example.tabswithswipe;

     import com.example.tabswithswipe.R;
     import your_package_name.adapter.TabsPagerAdapter;
     import android.os.Bundle;
     import android.app.ActionBar;
     import android.app.ActionBar.Tab;
     import android.app.FragmentTransaction;
     import android.support.v4.app.FragmentActivity;
     import android.support.v4.view.ViewPager;
     import android.view.Menu;

     public class MainActivity extends FragmentActivity implements
    ActionBar.TabListener {

private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private ActionBar actionBar;
// Tab titles
private String[] tabs = { "Top Rated", "Games", "Movies" };

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Initialization
    viewPager = (ViewPager) findViewById(R.id.pager);
    actionBar = getActionBar();
    mAdapter = new TabsPagerAdapter(getSupportFragmentManager());

    viewPager.setAdapter(mAdapter);
    actionBar.setHomeButtonEnabled(false);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);        

    // Adding Tabs
    for (String tab_name : tabs) {
        actionBar.addTab(actionBar.newTab().setText(tab_name)
                .setTabListener(this));
    }

    /**
     * on swiping the viewpager make respective tab selected
     * */
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            // on changing the page
            // make respected tab selected
            actionBar.setSelectedNavigationItem(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });
}



@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
    }

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}



@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    // on tab selected
    // show respected fragment view
    viewPager.setCurrentItem(tab.getPosition());
}



@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}

}

My TabbsPagerAdapter:

     package your_package_name.adapter;

     import android.support.v4.app.Fragment;
     import android.support.v4.app.FragmentManager;
     import android.support.v4.app.FragmentPagerAdapter;
     import android.support.v4.app.ListFragment;

     public class TabsPagerAdapter extends FragmentPagerAdapter {

public TabsPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int index) {

    switch (index) {
    case 0:
        // Top Rated fragment activity
        return new NewUser();
    case 1:
        // Games fragment activity
        return new MyListFragment();
    case 2:
        // Movies fragment activity
        return new MoviesFragment();
    }

    return null;
}

@Override
public int getCount() {
    // get item count - equal to number of tabs
    return 3;
}

  }

My ListFragment:

    package your_package_name.adapter;

    import android.os.Bundle;
    import android.support.v4.app.ListFragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;

    public class MyListFragment extends ListFragment {

     @Override
     public void onActivityCreated(Bundle savedInstanceState) {
       super.onActivityCreated(savedInstanceState);
       String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
    "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
    "Linux", "OS/2" };
       ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
    android.R.layout.simple_list_item_1, values);
       setListAdapter(adapter);
     }

     @Override
     public void onListItemClick(ListView l, View v, int position, long id) {
       // do something with the data
     }

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

    View rootView = inflater.inflate(android.R.layout.simple_list_item_1, container, false);
    return rootView;


}



}
Was it helpful?

Solution 2

A ListFragment is just a wrapper around Fragment but has already a ListView ready for you to use.

This would do the trick:

public class MyListFragment extends ListFragment {

    @Override   
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
        "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
        "Linux", "OS/2" };

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

        setListAdapter(adapter);

        return super.onCreateView(inflater,container,savedInstanceState);
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
      // do something with the data
    }
}

OTHER TIPS

Try this way: Create a new res/layout/listfragment1.xml file

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:orientation="vertical"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:paddingLeft="8dp"
     android:paddingRight="8dp">

 <ListView android:id="@id/android:list"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:layout_weight="1"
           android:drawSelectorOnTop="false"/>

 <TextView android:id="@id/android:empty"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:text="No data"/>
</LinearLayout>

Create a new MyListFragment1.java class, extends ListFragment. Override onCreate(), onCreateView() and onListItemClick() methods.

public class MyListFragment1 extends ListFragment {

 String[] month ={
 "January", 
 "February", 
 "March", 
 "April",
 "May", 
 "June", 
 "July", 
 "August",
 "September", 
 "October", 
 "November", 
 "December"
};

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
   ListAdapter myListAdapter = new ArrayAdapter<String>(
  getActivity(),
   android.R.layout.simple_list_item_1,
   month);
   setListAdapter(myListAdapter);
}

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

 @Override
 public void onListItemClick(ListView l, View v, int position, long id) {
 // TODO Auto-generated method stub
 Toast.makeText(
 getActivity(), 
  getListView().getItemAtPosition(position).toString(), 
  Toast.LENGTH_LONG).show();
  }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top