3

I have implemented a swipey tabs app using viewpager by using this template in Eclipse enter image description here

Now i get an activity which extends FragmentActivity like this

        package com.example.abcd2;

    import java.util.Locale;

    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentActivity;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentPagerAdapter;
    import android.support.v4.app.NavUtils;
    import android.support.v4.view.ViewPager;
    import android.view.Gravity;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;

    public class MainActivity extends FragmentActivity {

        /**
         * The {@link android.support.v4.view.PagerAdapter} that will provide
         * fragments for each of the sections. We use a
         * {@link android.support.v4.app.FragmentPagerAdapter} derivative, which
         * will keep every loaded fragment in memory. If this becomes too memory
         * intensive, it may be best to switch to a
         * {@link android.support.v4.app.FragmentStatePagerAdapter}.
         */
        SectionsPagerAdapter mSectionsPagerAdapter;

        /**
         * The {@link ViewPager} that will host the section contents.
         */
        ViewPager mViewPager;

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

            // Create the adapter that will return a fragment for each of the three
            // primary sections of the app.
            mSectionsPagerAdapter = new SectionsPagerAdapter(
                    getSupportFragmentManager());

            // Set up the ViewPager with the sections adapter.
            mViewPager = (ViewPager) findViewById(R.id.pager);
            mViewPager.setAdapter(mSectionsPagerAdapter);

        }

        @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;
        }

        /**
         * A {@link FragmentPagerAdapter} that returns a fragment corresponding to
         * one of the sections/tabs/pages.
         */
        public class SectionsPagerAdapter extends FragmentPagerAdapter {

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

            @Override
            public Fragment getItem(int position) {
                // getItem is called to instantiate the fragment for the given page.
                // Return a DummySectionFragment (defined as a static inner class
                // below) with the page number as its lone argument.
                if(position==0)
{
Fragment frag2=new ShowFrag2();
                return frag2;}
else
{
Fragment fragment = new DummySectionFragment();
                Bundle args = new Bundle();
                args.putInt(DummySectionFragment.ARG_SECTION_NUMBER, position + 1);
                fragment.setArguments(args);
                return fragment;}
            }

            @Override
            public int getCount() {
                // Show 3 total pages.
                return 3;
            }

            @Override
            public CharSequence getPageTitle(int position) {
                Locale l = Locale.getDefault();
                switch (position) {
                case 0:
                    return getString(R.string.title_section1).toUpperCase(l);
                case 1:
                    return getString(R.string.title_section2).toUpperCase(l);
                case 2:
                    return getString(R.string.title_section3).toUpperCase(l);
                }
                return null;
            }
        }

        /**
         * A dummy fragment representing a section of the app, but that simply
         * displays dummy text.
         */
        public static class DummySectionFragment extends Fragment {
            /**
             * The fragment argument representing the section number for this
             * fragment.
             */
            public static final String ARG_SECTION_NUMBER = "section_number";

            public DummySectionFragment() {
            }

            @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                    Bundle savedInstanceState) {
                View rootView = inflater.inflate(R.layout.fragment_main_dummy,
                        container, false);
                TextView dummyTextView = (TextView) rootView
                        .findViewById(R.id.section_label);
                dummyTextView.setText(Integer.toString(getArguments().getInt(
                        ARG_SECTION_NUMBER)));
                return rootView;
            }
        }

    }

In this, to create a new fragment in one of the tabs, i use if-else based on position in the getItem() method as shown. The fragment showfrag2 is this

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class ShowFrag2 extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.frag2, container, false);
    }
}

My question is, how do i create a listview in one of this fragments . I would like to use a simple listview only in this manner

LevelAdapter adapter = new LevelAdapter(this,
            R.layout.list_item, weather_data);


    listView1 = (ListView)findViewById(R.id.listView1);



    listView1.setAdapter(adapter);

But this has been done in an activity. How can i use something like this in the fragment above. Also, i cannot use ListFragment as the getView() method is returning a fragment. Please help regarding how to implement this. Thanks EDIT: Here is my adapter code :

    package com.example.abcd3;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class LevelAdapter extends ArrayAdapter<Level> {

     static Context context;
        static int layoutResourceId;   
        static Level data[] = null;

    /*    public LevelAdapter(Context context, int layoutResourceId, Level[] data) {
            super(context, layoutResourceId, data);
            this.layoutResourceId = layoutResourceId;
            this.context = context;
            this.data = data;
        }*/

        public LevelAdapter(ShowFrag1 showFrag1, int listItem,
                Level[] weather_data) {
            super(context, layoutResourceId, data);
            this.layoutResourceId = layoutResourceId;
            this.context = context;
            this.data = data;

            // TODO Auto-generated constructor stub
        }

        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View row = convertView;
            WeatherHolder holder = null;

            if(row == null)
            {
                LayoutInflater inflater = ((Activity)context).getLayoutInflater();
                row = inflater.inflate(layoutResourceId, parent, false);

                holder = new WeatherHolder();
                holder.imgIcon = (ImageView)row.findViewById(R.id.imgIcon);
                holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);
               // holder.imgIcon2=(ImageView)row.findViewById(R.id.imgIcon2);


                row.setTag(holder);
            }
            else
            {
                holder = (WeatherHolder)row.getTag();
            }

            Level weather = data[position];
            holder.txtTitle.setText(weather.title);
            holder.imgIcon.setImageResource(weather.icon);

            return row;
        }

        static class WeatherHolder
        {
            ImageView imgIcon;
            TextView txtTitle;
        //    ImageView imgIcon2;
        }

}
Shivam Bhalla
  • 1,879
  • 5
  • 35
  • 63

1 Answers1

3

Make sure you have ListView defined in R.layout.frag2 and set the adapter to listview in onCreateView of ShowFrag2. (Similar to the way its done in activity)

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

    View fragmentLayout = inflater.inflate(R.layout.frag2, container, false);

    ListView listView1 = (ListView) fragmentLayout.findViewById(R.id.mylistview);

    LevelAdapter adapter = new LevelAdapter(this, R.layout.list_item, weather_data);
    listView1 = (ListView)findViewById(R.id.listView1);
    listView1.setAdapter(adapter);

    return fragmentLayout;

}
Alex Roy
  • 120
  • 1
  • 12
Wand Maker
  • 18,476
  • 8
  • 53
  • 87
  • Thanks, but the findviewbyid() and getlistview() functions do not come up in the list of available function if I try what you said in fragment. Can you post some example code if possible? – Shivam Bhalla Jul 15 '13 at 08:21
  • Added a example, you can follow it. I have not tested it, but you get the idea – Wand Maker Jul 15 '13 at 09:01
  • i am getting a null pointer exception in the line inflater line even though i have defined the XML file and also in the line where we create an object of the adapter. – Shivam Bhalla Jul 15 '13 at 09:20
  • please check the updated question. i have added the code for my adapter which is giving null pointer exception. I am also getting error in the line where we create an object of the adapter if I remove "static" from the adapter's code. where is the mistake? I am getting nullpointerexception:storage==null – Shivam Bhalla Jul 15 '13 at 09:29
  • i think the issue is with the constructor being incompatible with fragments. How do i rectify that? – Shivam Bhalla Jul 15 '13 at 09:40
  • no. i have fixed that issue . instead of `LevelAdapter adapter = new LevelAdapter(this, R.layout.list_item, weather_data); ` it should be `LevelAdapter adapter = new LevelAdapter(getActivity(), R.layout.list_item, weather_data);` – Shivam Bhalla Jul 15 '13 at 12:06
  • can you help http://stackoverflow.com/questions/40149039/viewpager-recyclerview-issue – albert Oct 22 '16 at 06:46