androidandroid-query

Android Query - load Images in ListView with Aspect Ratio in Fragment


I want to use Android Query library to load a fragment with a listview in order to display up to 5 photos keeping the aspect ratio. I have followed the piece of code provided in the demo app of AQ trying to adapt it with a fragment and not a view.

Here is the piece of code:

package com.example.testaq;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import com.androidquery.AQuery;

import android.app.Fragment;
import android.app.FragmentManager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.AdapterView.OnItemClickListener;

public class PhotoFragment extends Fragment {

    protected AQuery listAq;

    public PhotoFragment() {

    }

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

        View rootView = inflater.inflate(R.layout.fragment_photo, container, false);

        // Android Query - Initialization - used to load the pictures
        AQuery listAq = new AQuery(getActivity(), rootView);

        return rootView;
    }

    @Override
    public void onStart() {
        super.onStart();

        // If we need to do anything with the layout it is the place to do so...
        final HashMap<String, String> myHashMap;
        List<String> items = new ArrayList<String>();
        Button myAddPhoto;
        ListView myListPhotos;

        myAddPhoto=(Button) getActivity().findViewById(R.id.button_addphoto);
        myListPhotos=(ListView) getActivity().findViewById(R.id.list_photos);
        myHashMap = MainActivity.LAST_OUTPUT.get(MainActivity.LAST_ID);

        // Loads the URL of the photos in a list (up to 5, in MainActivity variables)
        if( !myHashMap.get(MainActivity.KEY_PHOTO).equals("") ) items.add(MainActivity.DOMAIN + myHashMap.get(MainActivity.KEY_PHOTO));
        if( !myHashMap.get(MainActivity.KEY_PHOTO2).equals("") ) items.add(MainActivity.DOMAIN + myHashMap.get(MainActivity.KEY_PHOTO2));
        if( !myHashMap.get(MainActivity.KEY_PHOTO3).equals("") ) items.add(MainActivity.DOMAIN + myHashMap.get(MainActivity.KEY_PHOTO3));
        if( !myHashMap.get(MainActivity.KEY_PHOTO4).equals("") ) items.add(MainActivity.DOMAIN + myHashMap.get(MainActivity.KEY_PHOTO4));
        if( !myHashMap.get(MainActivity.KEY_PHOTO5).equals("") ) items.add(MainActivity.DOMAIN + myHashMap.get(MainActivity.KEY_PHOTO5));

        ArrayAdapter<String> aa = new ArrayAdapter<String>(getActivity(), R.layout.list_photo, items){

            @Override
            public View getView(int position, View convertView, ViewGroup parent) {

                if(convertView == null){
                    convertView = getActivity().getLayoutInflater().inflate(R.layout.list_photo, null);
                }

                String url = getItem(position);

                AQuery aq = listAq.recycle(convertView);
                aq.id(R.id.tb).image(url, true, true, 0, 0, null, 0, AQuery.RATIO_PRESERVE);

                return convertView;
            }
        };

        listAq.id(R.id.list_photos).adapter(aa);

    }

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

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    }

}

Problem is that the app crashes, here is the error:

02-22 17:08:35.339: E/AndroidRuntime(14259): FATAL EXCEPTION: main 02-22 17:08:35.339: E/AndroidRuntime(14259): java.lang.NullPointerException 02-22 17:08:35.339: E/AndroidRuntime(14259): at com.example.testaq.PhotoFragment.onStart(PhotoFragment.java:94) 02-22 17:08:35.339: E/AndroidRuntime(14259): at android.app.Fragment.performStart(Fragment.java:1719) 02-22 17:08:35.339: E/AndroidRuntime(14259): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:913) 02-22 17:08:35.339: E/AndroidRuntime(14259): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057) 02-22 17:08:35.339: E/AndroidRuntime(14259): at android.app.BackStackRecord.run(BackStackRecord.java:682) 02-22 17:08:35.339: E/AndroidRuntime(14259): at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435) 02-22 17:08:35.339: E/AndroidRuntime(14259): at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441) 02-22 17:08:35.339: E/AndroidRuntime(14259): at android.os.Handler.handleCallback(Handler.java:725) 02-22 17:08:35.339: E/AndroidRuntime(14259): at android.os.Handler.dispatchMessage(Handler.java:92) 02-22 17:08:35.339: E/AndroidRuntime(14259): at android.os.Looper.loop(Looper.java:137) 02-22 17:08:35.339: E/AndroidRuntime(14259): at android.app.ActivityThread.main(ActivityThread.java:5039) 02-22 17:08:35.339: E/AndroidRuntime(14259): at java.lang.reflect.Method.invokeNative(Native Method) 02-22 17:08:35.339: E/AndroidRuntime(14259): at java.lang.reflect.Method.invoke(Method.java:511) 02-22 17:08:35.339: E/AndroidRuntime(14259): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 02-22 17:08:35.339: E/AndroidRuntime(14259): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 02-22 17:08:35.339: E/AndroidRuntime(14259): at dalvik.system.NativeStart.main(Native Method) 02-22 17:12:15.761: I/Process(14259): Sending signal. PID: 14259 SIG: 9

The crash happens on this line:

listAq.id(R.id.list_photos).adapter(aa);

Any idea on what i am doing wrong? I could not find an example of app with a fragment and listview of images as I want to do..

Thanks for your ideas!


Solution

  • Found the issue!

    Replaced

        AQuery listAq = new AQuery(getActivity(), rootView);
    

    By

        listAq = new AQuery(getActivity(), rootView);
    

    :)