0

I am a beginner in java/android programming but I was trying to add different tutorials to create a customized application that does what I want, this could be something easy to most of the people here but am stuck in this one am trying to use this Navigation Drawer View Pager trying to populate the tab one fragment with this Custom ListView with Volley.

I want to transfer the code in the MainActivity.java of custom listview to a tab fragment in navigation drawer but I get errors.

Fragment Tab

public class TabTwoFragment extends Fragment{

private TextView txtFragmenttwo;

public static TabTwoFragment newInstance() {
    Bundle bundle = new Bundle();

    TabTwoFragment fragment = new TabTwoFragment();
    fragment.setArguments(bundle);

    return fragment;
}   

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

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

    txtFragmenttwo = (TextView) rootView.findViewById(R.id.txtFragmentTwo);
    txtFragmenttwo.setText(R.string.fragment_tab_two);

    rootView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT ));       
    return rootView;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onActivityCreated(savedInstanceState);
    setHasOptionsMenu(true);
}`

MainActivity

public class MainActivity extends Activity {
// Log tag
private static final String TAG = MainActivity.class.getSimpleName();

// Movies json url
private static final String url = "http://api.androidhive.info/json/movies.json";
private ProgressDialog pDialog;
private List<Movie> movieList = new ArrayList<Movie>();
private ListView listView;
private CustomListAdapter adapter;

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

    listView = (ListView) findViewById(R.id.list);
    adapter = new CustomListAdapter(this, movieList);
    listView.setAdapter(adapter);

    pDialog = new ProgressDialog(this);
    // Showing progress dialog before making http request
    pDialog.setMessage("Loading...");
    pDialog.show();

    // changing action bar color
    getActionBar().setBackgroundDrawable(
            new ColorDrawable(Color.parseColor("#1b1b1b")));

    // Creating volley request obj
    JsonArrayRequest movieReq = new JsonArrayRequest(url,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    Log.d(TAG, response.toString());
                    hidePDialog();

                    // Parsing json
                    for (int i = 0; i < response.length(); i++) {
                        try {

                            JSONObject obj = response.getJSONObject(i);
                            Movie movie = new Movie();
                            movie.setTitle(obj.getString("title"));
                            movie.setThumbnailUrl(obj.getString("image"));
                            movie.setRating(((Number) obj.get("rating"))
                                    .doubleValue());
                            movie.setYear(obj.getInt("releaseYear"));

                            // Genre is json array
                            JSONArray genreArry = obj.getJSONArray("genre");
                            ArrayList<String> genre = new ArrayList<String>();
                            for (int j = 0; j < genreArry.length(); j++) {
                                genre.add((String) genreArry.get(j));
                            }
                            movie.setGenre(genre);

                            // adding movie to movies array
                            movieList.add(movie);

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                    }

                    // notifying list adapter about data changes
                    // so that it renders the list view with updated data
                    adapter.notifyDataSetChanged();
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d(TAG, "Error: " + error.getMessage());
                    hidePDialog();

                }
            });

    // Adding request to request queue
    AppController.getInstance().addToRequestQueue(movieReq);
}

Both Code

public class TabOneFragment extends Fragment{

private static final String TAG = TabOneFragment.class.getSimpleName();

// Movies json url
private static final String url = "http://api.androidhive.info/json/movies.json";
private ProgressDialog pDialog;
private List<Movie> movieList = new ArrayList<Movie>();
private ListView listView;
private CustomListAdapter adapter;
//private TextView txtFragmentone;

@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
}

public static TabOneFragment newInstance() {
    TabOneFragment fragment = new TabOneFragment();
    return fragment;
}   

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

    View rootView = inflater.inflate(R.layout.one_fragment, container, false);
    //txtFragmentone = (TextView) rootView.findViewById(R.id.txtFragmentOne);
    //txtFragmentone.setText(R.string.fragment_tab_one);
    rootView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT ));

    listView = (ListView) getActivity().findViewById(R.id.list);

    adapter = new CustomListAdapter(this, movieList);
    listView.setAdapter(adapter);

    pDialog = new ProgressDialog(this);
    // Showing progress dialog before making http request
    pDialog.setMessage("Loading...");
    pDialog.show();

    // changing action bar color
    getActivity().getActionBar().setBackgroundDrawable(
            new ColorDrawable(Color.parseColor("#1b1b1b")));

    // Creating volley request obj
    JsonArrayRequest movieReq = new JsonArrayRequest(url,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    Log.d(TAG, response.toString());
                    hidePDialog();

                    // Parsing json
                    for (int i = 0; i < response.length(); i++) {
                        try {

                            JSONObject obj = response.getJSONObject(i);
                            Movie movie = new Movie();
                            movie.setTitle(obj.getString("title"));
                            movie.setThumbnailUrl(obj.getString("image"));
                            movie.setRating(((Number) obj.get("rating"))
                                    .doubleValue());
                            movie.setYear(obj.getInt("releaseYear"));

                            // Genre is json array
                            JSONArray genreArry = obj.getJSONArray("genre");
                            ArrayList<String> genre = new ArrayList<String>();
                            for (int j = 0; j < genreArry.length(); j++) {
                                genre.add((String) genreArry.get(j));
                            }
                            movie.setGenre(genre);

                            // adding movie to movies array
                            movieList.add(movie);

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                    }

                    // notifying list adapter about data changes
                    // so that it renders the list view with updated data
                    adapter.notifyDataSetChanged();
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    VolleyLog.d(TAG, "Error: " + error.getMessage());
                    hidePDialog();

                }
            });

    // Adding request to request queue
    AppController.getInstance().addToRequestQueue(movieReq);

    return rootView;
}

I get error at

adapter = new CustomListAdapter(this, movieList);

and

pDialog = new ProgressDialog(this);

constructor is undefined

Yet they both compile well in their examples.

This is the logcat am getting after running the code:

03-27 22:30:57.085: E/AndroidRuntime(10963): FATAL EXCEPTION: main
03-27 22:30:57.085: E/AndroidRuntime(10963): java.lang.NullPointerException
03-27 22:30:57.085: E/AndroidRuntime(10963):    at info.androidhive.customlistviewvolley.adater.CustomListAdapter.<init>(CustomListAdapter.java:24)
03-27 22:30:57.085: E/AndroidRuntime(10963):    at br.liveo.fragments.TabOneFragment.onCreateView(TabOneFragment.java:75)
03-27 22:30:57.085: E/AndroidRuntime(10963):    at android.support.v4.app.Fragment.performCreateView(Fragment.java:1500)
03-27 22:30:57.085: E/AndroidRuntime(10963):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:938)
03-27 22:30:57.085: E/AndroidRuntime(10963):    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1115)
03-27 22:30:57.085: E/AndroidRuntime(10963):    at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682)
03-27 22:30:57.085: E/AndroidRuntime(10963):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1478)
03-27 22:30:57.085: E/AndroidRuntime(10963):    at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:478)
03-27 22:30:57.085: E/AndroidRuntime(10963):    at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:141)
03-27 22:30:57.085: E/AndroidRuntime(10963):    at android.support.v4.view.ViewPager.populate(ViewPager.java:1068)
03-27 22:30:57.085: E/AndroidRuntime(10963):    at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
03-27 22:30:57.085: E/AndroidRuntime(10963):    at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436)
03-27 22:30:57.085: E/AndroidRuntime(10963):    at android.view.View.measure(View.java:12773)
03-27 22:30:57.085: E/AndroidRuntime(10963):    at android.widget.LinearLayout.measureVertical(LinearLayout.java:815)
03-27 22:30:57.085: E/AndroidRuntime(10963):    at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
03-27 22:30:57.085: E/AndroidRuntime(10963):    at android.view.View.measure(View.java:12773)
03-27 22:30:57.085: E/AndroidRuntime(10963):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4788)
03-27 22:30:57.085: E/AndroidRuntime(10963):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
03-27 22:30:57.085: E/AndroidRuntime(10963):    at android.view.View.measure(View.java:12773)
03-27 22:30:57.085: E/AndroidRuntime(10963):    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4788)
03-27 22:30:57.085: E/AndroidRuntime(10963):    at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
03-27 22:30:57.085: E/AndroidRuntime(10963):    at android.view.View.measure(View.java:12773)
03-27 22:30:57.085: E/AndroidRuntime(10963):    at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:704)

EDIT 2
CustomAdapterList

public class CustomListAdapter extends BaseAdapter {
private Activity activity;
private LayoutInflater inflater;
private List<Movie> movieItems;
ImageLoader imageLoader = AppController.getInstance().getImageLoader();

public CustomListAdapter(Activity activity, List<Movie> movieItems) {
    this.activity = activity;
    this.movieItems = movieItems;
}

@Override
public int getCount() {
    return movieItems.size();
}

@Override
public Object getItem(int location) {
    return movieItems.get(location);
}

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

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

    if (inflater == null)
        inflater = (LayoutInflater) activity
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    if (convertView == null)
        convertView = inflater.inflate(R.layout.list_row, null);

    if (imageLoader == null)
        imageLoader = AppController.getInstance().getImageLoader();
    NetworkImageView thumbNail = (NetworkImageView) convertView
            .findViewById(R.id.thumbnail);
    TextView title = (TextView) convertView.findViewById(R.id.title);
    TextView rating = (TextView) convertView.findViewById(R.id.rating);
    TextView genre = (TextView) convertView.findViewById(R.id.genre);
    TextView year = (TextView) convertView.findViewById(R.id.releaseYear);

    // getting movie data for the row
    Movie m = movieItems.get(position);

    // thumbnail image
    thumbNail.setImageUrl(m.getThumbnailUrl(), imageLoader);

    // title
    title.setText(m.getTitle());

    // rating
    rating.setText("Rating: " + String.valueOf(m.getRating()));

    // genre
    String genreStr = "";
    for (String str : m.getGenre()) {
        genreStr += str + ", ";
    }
    genreStr = genreStr.length() > 0 ? genreStr.substring(0,
            genreStr.length() - 2) : genreStr;
    genre.setText(genreStr);

    // release year
    year.setText(String.valueOf(m.getYear()));

    return convertView;
}
Derrick
  • 179
  • 2
  • 8

4 Answers4

1

Make this change in your Manifest file:

<application
android:name=".AppController" //this one (your path to AppController file)
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme">

In your TabOneFragment file in function onCreateView, change this line

listView = (ListView) getActivity().findViewById(R.id.list);

to

listView = (ListView) rootView.findViewById(R.id.list);


this will resolve your problem.

albert
  • 8,027
  • 10
  • 48
  • 84
sohaib karim
  • 281
  • 2
  • 12
0

On your class TabOneFragment Change to this:

adapter = new CustomListAdapter(getActivity(), movieList);

and

pDialog = new ProgressDialog(getActivity());


CustomAdapterList

 public class CustomListAdapter extends BaseAdapter {

        private Activity activity;
        private LayoutInflater inflater;
        private List<Movie> movieItems = new ArrayList<>();
        ImageLoader imageLoader = AppController.getInstance().getImageLoader();

        public CustomListAdapter(Activity activity, List<Movie> movieItems) {
            this.activity = activity;
            this.movieItems = movieItems;
            inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        @Override
        public int getCount() {
            return movieItems != null ? movieItems.size() : 0;
        }

        @Override
        public Object getItem(int location) {
            return movieItems != null ? movieItems.get(location) : null;
        }

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

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

            if (convertView == null)
                convertView = inflater.inflate(R.layout.list_row, parent, false);

            NetworkImageView thumbNail = (NetworkImageView) convertView.findViewById(R.id.thumbnail);
            TextView title = (TextView) convertView.findViewById(R.id.title);
            TextView rating = (TextView) convertView.findViewById(R.id.rating);
            TextView genre = (TextView) convertView.findViewById(R.id.genre);
            TextView year = (TextView) convertView.findViewById(R.id.releaseYear);

            // getting movie data for the row
            Movie m = movieItems.get(position);
            // thumbnail image
            thumbNail.setImageUrl(m.getThumbnailUrl(), imageLoader);            
            // title
            title.setText(m.getTitle());            
            // rating
            rating.setText("Rating: " + String.valueOf(m.getRating()));         
            // genre
            String genreStr = "";
            for (String str : m.getGenre()) {
                genreStr += str + ", ";
            }

            genreStr = genreStr.length() > 0 ? genreStr.substring(0,genreStr.length() - 2) : genreStr;
            genre.setText(genreStr);

            // release year
            year.setText(String.valueOf(m.getYear()));

            return convertView;
        }
    }
Anderson K
  • 5,445
  • 5
  • 35
  • 50
  • Thanks but this eliminates the errors but the the activity crashes am updating my question with the logcat am getting – Derrick Mar 27 '15 at 19:36
0

In TabOneFragment Class change

adapter = new CustomListAdapter(this, movieList);

to

adapter = new CustomListAdapter(getActivity(), movieList);

and

 pDialog = new ProgressDialog(this);

to

pDialog = new ProgressDialog(getActivity());

Both constructors accept a Context not a Fragment, so basicly in your fragment class you cannot call this but you'll have to you getActivity()

Arlind Hajredinaj
  • 8,380
  • 3
  • 30
  • 45
0

I found out and thought this could be helpful to some other person check this question i was missing

android:name=".AppController" in my manifest

<application
    android:name=".AppController" //this one
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
Community
  • 1
  • 1
Derrick
  • 179
  • 2
  • 8