android - 如何在android中的scrollView中添加gridView

标签 android gridview android-scrollview

在该问题被投票为可能与 this 重复之前, thisthis我有一个 Material 设计抽屉导航。在主要 Activity 中,我有以下元素,如图像 A 和 B 所示。我想添加 ScrollView 功能,以便滚动项目将使用户能够滚动包括 gridView 在内的整个布局,如下所示在图像 A 中看到。但是,在包含 ScrollView 时,我在 B 中遇到了问题,其中仅显示一行。我在 google 和 S/O 上进行了研究,但解决方案不起作用。解决方案没有<android.support.v4.widget.DrawerLayout作为父 View ,这样您就可以想象我是多么卡住。任何解决方案或解决方法都将受到赞赏。 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>

MainActivity.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);
    }
}

最佳答案

也许您需要这个自定义 gridView。

公共(public)类 InnerGridView 扩展 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);
}

}

关于android - 如何在android中的scrollView中添加gridView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29028149/

相关文章:

android - Typeface.ITALIC 不适用于 Galaxy Note 2

android - android中的自定义对象点击问题

c# - 使用 GridView 和 LINQ to SQL 进行分页

android - ScrollView 和 ConstraintLayout 在底部留下巨大的空白

Android - 如何制作可滚动的约束布局?

android - ScrollView 中的 RecyclerView 不起作用

android - 如何使用Retrofit进行同步调用

android - 增加 SwitchCompat 的轨道长度

asp.net - 以编程方式将 ButtonColumn 从 DataTable 添加到 GridView

android - 如何在 Android 中对齐 GridView 顶部的项目?