Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I use a cursorLoader in a ViewPager?

I have a `cursorLoader` which is working fine.

The problem is I'm not using it like I'm supposed to, I load the data from the cursorLoader into arrayLists and then use the lists.

I found this tutorial which shows how to use a cursorLoader with a viewPager but I don't understand how to actually make it happen.

http://tumble.mlcastle.net/post/25875136857/bridging-cursorloaders-and-viewpagers-on-android

I have a fragment which looks like this:

public class FirstFragment extends Fragment {
    MapView mapView;
    GoogleMap map;
    // Store instance variables
    private String email,about,imagepath,latitude,longitude;
    Button getDirections;

    // newInstance constructor for creating fragment with arguments
    public static FirstFragment newInstance(String email,String about,String imagepath, String latitude, String longitude) {
        FirstFragment fragmentFirst = new FirstFragment();
        Bundle args = new Bundle();
        args.putString("email", email);
        args.putString("about", about);
        args.putString("imagepath", imagepath);
        args.putString("latitude", latitude);
        args.putString("longitude", longitude);
        fragmentFirst.setArguments(args);
        return fragmentFirst;
    }

    // Store instance variables based on arguments passed
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        email = getArguments().getString("email");
        about = getArguments().getString("about");
        imagepath = getArguments().getString("imagepath");
        latitude = getArguments().getString("latitude");
        longitude = getArguments().getString("longitude");
    }

    // Inflate the view for the fragment based on layout XML
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             final Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.zzfragment_pager_items, container, false);
        ImageView imageView = (ImageView) view.findViewById(R.id.listpager_imageView);
        TextView about = (TextView) view.findViewById(R.id.listpager_text);
        TextView emaill = (TextView) view.findViewById(R.id.listpager_title);
        about.setText(this.about);
        emaill.setText(this.email);

        ImageLoader imageLoader = ImageLoader.getInstance();
        DisplayImageOptions options = new DisplayImageOptions.Builder().cacheInMemory(true)
                .cacheOnDisc(true).resetViewBeforeLoading(true)
                .considerExifParams(true)
                .build();
        imageLoader.getInstance().displayImage(imagepath, imageView, options);

        getDirections = (Button) view.findViewById(R.id.getdirections);

        getDirections.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String strUri = "http://maps.google.com/maps?q=loc:" + latitude + "," + longitude + " (" + email + ")";
                Intent mapIntent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(strUri));

                mapIntent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");

                getActivity().startActivity(mapIntent);

            }
        });

//        View v = inflater.inflate(R.layout.listviewtopager, container, false);
        // Gets the MapView from the XML layout and creates it
        mapView = (MapView) view.findViewById(R.id.mapview);
        mapView.onCreate(savedInstanceState);

        // Gets to GoogleMap from the MapView and does initialization stuff
        map = mapView.getMap();
        map.getUiSettings().setMyLocationButtonEnabled(false);
        map.setMyLocationEnabled(true);

        // Needs to call MapsInitializer before doing any CameraUpdateFactory calls
        MapsInitializer.initialize(this.getActivity());

        // Updates the location and zoom of the MapView
        CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(new LatLng(Double.parseDouble(latitude), Double.parseDouble(longitude)), 10);
        map.animateCamera(cameraUpdate);

        return view;
    }

    @Override
    public void onResume() {
        mapView.onResume();
        super.onResume();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }

    @Override
    public void onLowMemory() {
        super.onLowMemory();
        mapView.onLowMemory();
    }
}

And I was calling it in this class:

public class ViewPagerFragment extends FragmentActivity implements
        LoaderManager.LoaderCallbacks<Cursor>{

    ArrayList<String> e

mail = new ArrayList<String>();
ArrayList<String> about = new ArrayList<String>();

ArrayList<String> imagepath = new ArrayList<String>();

ArrayList<String> latitude = new ArrayList<String>();

ArrayList<String> longitude = new ArrayList<String>();

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_view_pager_fragment);
    getLoaderManager().initLoader(1, null, this);
}

private SmartFragmentStatePagerAdapter adapterViewPager;

// Extend from SmartFragmentStatePagerAdapter now instead for more dynamic ViewPager items
public static class MyPagerAdapter extends SmartFragmentStatePagerAdapter {
    private final ArrayList<String> email;
    private final ArrayList<String> about;
    private final ArrayList<String> imagepath;
    private final ArrayList<String> latitude;
    private final ArrayList<String> longitude;
    private int listPosition;

    public MyPagerAdapter(FragmentManager fragmentManager,ArrayList<String> email,ArrayList<String> about, ArrayList<String> imagepath,ArrayList<String> latitude,ArrayList<String> longitude,int lPosition) {
        super(fragmentManager);
        this.imagepath=imagepath;
        this.email=email;
        this.about = about;
        this.latitude= latitude;
        this.longitude = longitude;
        listPosition = lPosition;
    }

// Returns total number of pages
@Override
public int getCount() {
    return email.size();
}



 // Returns the fragment to display for that page
    @Override
        public Fragment getItem(int position) {
//            return FirstFragment.newInstance(listPosition+position, email.get(listPosition+position));
            return FirstFragment.newInstance(email.get(position), about.get(position),imagepath.get(position),latitude.get(position),longitude.get(position));
    }

    // Returns the page title for the top indicator
    @Override
    public CharSequence getPageTitle(int position) {
        return "Page " + position;
    }

}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    String[] projection =
            {
                    ActivitiesTable.KEY_EMAIL,
                    ActivitiesTable.KEY_ABOUT,
                    ActivitiesTable.KEY_IMAGEPATH,
                    ActivitiesTable.KEY_LATITUDE,
                    ActivitiesTable.KEY_LONGITUTDE

            };
    CursorLoader cursorLoader = new CursorLoader(this, NameContentProvider.NAME_ACTIVITIES_URI, projection,
            null, null, null);
    return cursorLoader;
}

@Override
public void onLoadFinished(android.content.Loader<Cursor> loader, Cursor cursor) {
    if (cursor != null && cursor.getCount() > 0) {
        cursor.moveToFirst();
        do {
            email.add(cursor.getString(cursor
                    .getColumnIndexOrThrow("email")));
            about.add(cursor.getString(cursor
                    .getColumnIndexOrThrow("about")));
            imagepath.add(cursor.getString(cursor
                    .getColumnIndexOrThrow("imagepath")));
            latitude.add(cursor.getString(cursor
                    .getColumnIndexOrThrow("serverLatitude")));
            longitude.add(cursor.getString(cursor
                    .getColumnIndexOrThrow("serverLongitude")));
        } while (cursor.moveToNext());
    }

    int listPosition = getIntent().getExtras().getInt("position");


    ViewPager vpPager = (ViewPager) findViewById(R.id.vpPager);
    adapterViewPager = new MyPagerAdapter(getSupportFragmentManager(),email,about,imagepath,latitude,longitude,listPosition);
    vpPager.setAdapter(adapterViewPager);
    vpPager.setCurrentItem(listPosition);

}

@Override
public void onLoaderReset(android.content.Loader<Cursor> loader) {



   }
}

How can I modify the code to use the viewPager with the loader directly by using that tutorial, instead of storing everything in lists and then using the lists ?

like image 487
Bogdan Daniel Avatar asked Jun 26 '15 13:06

Bogdan Daniel


People also ask

Can I use ViewPager with views not with fragments?

yes...you can use View instead of Fragment in viewpager. Here you can Find Whole example that will help you to achieve Viewpager without Fragment. Go through this documentation. Save this answer.

Can you put a ViewPager in a fragment?

Steps for implementing viewpager: Adding the ViewPager widget to the XML layout (usually the main_layout). Creating an Adapter by extending the FragmentPagerAdapter or FragmentStatePagerAdapter class.


1 Answers

I can't comment, so I'm writing an answer..

You have an activity that implements LoaderCallbacks<Cursor>. Your activity receives onLoadFinished callback when your data is loaded. Inside this method you have a Cursor that should be displayed in your ViewPager.

To display the data from Cursor, you call swapCursor method on the adapter. So, do not create adapter each time you load data. Create it once, and then just call swapCursor on it.

Also, do not find ViewPager each time - findViewById is a heavy operation, it should be performed once the view hierarchy is created.

So, your onLoadFinished will look like this:

@Override
public void onLoadFinished(android.content.Loader<Cursor> loader, Cursor cursor) {
    if (adapterViewPager == null) {
        adapterViewPager = new MyPagerAdapter(getSupportFragmentManager(), cursor);
        vpPager.setAdapter(adapterViewPager);
    } else {
        adapterViewPager.swapCursor(cursor);
    }
}
like image 74
Gennadii Saprykin Avatar answered Nov 09 '22 09:11

Gennadii Saprykin