2

Before the question is voted as a possible duplicate of this ,this or this I have a material design navigation drawer.On the main activity i have the following elements as seen from images A and B. I wanted to add a scrollview feature so that scrolling the items will enable the user scroll the entire layout inclusive of the gridView as seen in image A. However on including the scrollview i get the problems in B where only one row is displayed.I researched on google and on S/O and the solutions did not work. The solutions did not have <android.support.v4.widget.DrawerLayout as the parent view so you can image how stuck i am.Any solutions or work around will be apreciated.enter image description here

activity_main.xml:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="match_parent"
        tools:context="com.snappy.stevekamau.cosmeticsapp.MainActivity">

        <include
            android:id="@+id/app_bar"
            layout="@layout/app_bar"></include>


        <ImageView
            android:id="@+id/imageTop"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_below="@+id/app_bar"

            android:layout_marginLeft="3dp"
            android:layout_marginRight="3dp"

            android:src="@drawable/fairnessteaser" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignRight="@+id/imageTop"
            android:layout_below="@+id/app_bar"
            android:background="@drawable/red_button"
            style="@style/button_text"
            android:layout_alignBaseline="@+id/imageTop"
            android:text="Explore" />

        <TextView
            android:id="@+id/whatsNew"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/imageTop"
            android:text="What's new" />

        <GridView
            android:id="@+id/grid"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_below="@+id/whatsNew"
            android:columnWidth="100dp"
            android:gravity="center"
            android:horizontalSpacing="3dp"
            android:listSelector="@drawable/list_row_selector"
            android:numColumns="3"
            android:padding="3dp"
            android:stretchMode="columnWidth"
            android:verticalSpacing="10dp" />


    </RelativeLayout>
</ScrollView>
    <fragment
        android:id="@+id/fragment_navigation_drawer"
        android:name="com.snappy.stevekamau.cosmeticsapp.NavigationDrawerFragment"
        android:layout_width="@dimen/nav_drawer_width"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        app:layout="@layout/fragment_navigation_drawer"
        tools:layout="@layout/fragment_navigation_drawer"></fragment>

</android.support.v4.widget.DrawerLayout>

MainAcvtivity.java

MainAcvtivity.java

public class MainActivity extends ActionBarActivity {

    private Toolbar toolbar;
    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 GridView gridView;
    private CustomListAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        toolbar = (Toolbar) findViewById(R.id.app_bar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        NavigationDrawerFragment drawerFragment = (NavigationDrawerFragment)
                getSupportFragmentManager().findFragmentById(R.id.fragment_navigation_drawer);
        drawerFragment.setUp(R.id.fragment_navigation_drawer, (DrawerLayout) findViewById(R.id.drawer_layout), toolbar);


        gridView = (GridView) findViewById(R.id.grid);
        adapter = new CustomListAdapter(this, movieList);
        gridView.setAdapter(adapter);

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



        // 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);
    }

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

    private void hidePDialog() {
        if (pDialog != null) {
            pDialog.dismiss();
            pDialog = null;
        }
    }


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

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}
Community
  • 1
  • 1
Steve Kamau
  • 2,755
  • 10
  • 42
  • 73

2 Answers2

3

Maybe you need this custom gridView.

public class InnerGridView extends GridView {

public InnerGridView(Context context) {
    super(context);
}

public InnerGridView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public InnerGridView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    // Max Height
    int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
            MeasureSpec.AT_MOST);


    super.onMeasure(widthMeasureSpec, expandSpec);
}

}

innershows
  • 64
  • 5
2

I thought i might add this for anyone else who comes looking for a complete answer .After implementing @innershows answer,i created the class InnerGridView and made a reference to my onCreate() in my MainActivity like:InnerGridView gridView = (InnerGridView) findViewById(R.id.grid); adapter = new CustomListAdapter(this, movieList); gridView.setAdapter(adapter); Then on my activty_main:

<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="match_parent"
        tools:context="com.snappy.stevekamau.cosmeticsapp.MainActivity">

        <include
            android:id="@+id/app_bar"
            layout="@layout/app_bar"></include>


        <ImageView
            android:id="@+id/imageTop"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_below="@+id/app_bar"

            android:layout_marginLeft="3dp"
            android:layout_marginRight="3dp"

            android:src="@drawable/fairnessteaser" />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignRight="@+id/imageTop"
            android:layout_below="@+id/app_bar"
            android:background="@drawable/red_button"
            style="@style/button_text"
            android:layout_alignBaseline="@+id/imageTop"
            android:text="Explore" />

        <TextView
            android:id="@+id/whatsNew"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/imageTop"
            android:text="What's new" />

        <com.snappy.stevekamau.cosmeticsapp.InnerGridView
            android:id="@+id/grid"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_below="@+id/whatsNew"
            android:columnWidth="100dp"
            android:gravity="center"
            android:horizontalSpacing="3dp"
            android:listSelector="@drawable/list_row_selector"
            android:numColumns="3"
            android:padding="3dp"
            android:stretchMode="columnWidth"
            android:verticalSpacing="10dp" />


    </RelativeLayout>
</ScrollView>
<fragment
    android:id="@+id/fragment_navigation_drawer"
    android:name="com.snappy.stevekamau.cosmeticsapp.NavigationDrawerFragment"
    android:layout_width="@dimen/nav_drawer_width"
    android:layout_height="match_parent"
    android:layout_gravity="start"
    app:layout="@layout/fragment_navigation_drawer"
    tools:layout="@layout/fragment_navigation_drawer"></fragment>

Steve Kamau
  • 2,755
  • 10
  • 42
  • 73