RecyclerView is not showing in NestedScrollView

Austin E picture Austin E · Oct 8, 2015 · Viewed 7k times · Source

I have looked at a few similar incidents of this on StackOverflow. However none seem to apply to my case. The issue I'm having is that my RecyclerView is working but nothing is displaying. I have run multiple tests to try and figure out why it isn't working but all have just supported the fact that it is working correctly.

The log in getItemCount returns 3, which is the correct number. I just don't understand why it is not showing. I looked back at a recycler view I did in a previous activity and they both match to an extent(Other recycler has more information to set).

Thank you for any help you can provide.

Edit: I found the issue, but still need help. It was the collapsing toolbar that was causing it. If I move the RecyclerView outside the NestedScrollView I can see the items. However The content does not move correctly like the commented out TextViews do in the activity_project_detail.xml. I guess my new question is how do I get a RecyclerView to work inside a NestedScrollView. Thanks you!

ProjectDetailsActivity.java

package com.austinerck.projectpanda.activity;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;

import com.austinerck.projectpanda.R;
import com.austinerck.projectpanda.adapter.TaskAdapter;
import com.austinerck.projectpanda.data.LocalDatabase;
import com.austinerck.projectpanda.data.Project;
import com.austinerck.projectpanda.data.Task;

import java.util.ArrayList;

public class ProjectDetailsActivity extends AppCompatActivity {

    private boolean connectionState;

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

        //Sets toolbar and up navigation
        setSupportActionBar((Toolbar) findViewById(R.id.toolbar));
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        //Gets the connection state from the intent
        connectionState = getIntent().getExtras().getBoolean(LocalDatabase.CONNECTION_STATE);

        //Gets the projects from the intent
        Project project = getIntent().getExtras().getParcelable(LocalDatabase.PROJECT_DETAILS);

        //Sets activity title
        setTitle(project.getTitle());

        //Generates Task arrays
        ArrayList<Task> tasksUncompleted = Task.getUncompletedTasks(project.getTasks());
        ArrayList<Task> tasksCompleted = Task.getCompletedTasks(project.getTasks());

        //TODO: Fix recycler views
        RecyclerView recyclerUncompleted = (RecyclerView) findViewById(R.id.detail_uncompleted);
        recyclerUncompleted.setLayoutManager(new LinearLayoutManager(this));
        recyclerUncompleted.setAdapter(new TaskAdapter(tasksUncompleted));
        registerForContextMenu(recyclerUncompleted);
    }

    @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_projects_list, 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);
    }
}

TaskAdapter.java

package com.austinerck.projectpanda.adapter;

import android.app.Activity;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.austinerck.projectpanda.R;
import com.austinerck.projectpanda.data.LocalDatabase;
import com.austinerck.projectpanda.data.Project;
import com.austinerck.projectpanda.data.ProjectCardView;
import com.austinerck.projectpanda.data.Task;
import com.austinerck.projectpanda.data.TaskView;

import java.util.ArrayList;

public class TaskAdapter extends RecyclerView.Adapter {

    private ArrayList<Task> tasks;

    public TaskAdapter(ArrayList<Task> tasks) {
        this.tasks = tasks;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        //Selects the layout used in the Recycler
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fragment_task, parent, false);

        return new TaskView(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        TaskView view = (TaskView) holder;

        //Gets the views that need to be changed
        view.getTitle().setText(tasks.get(position).getTitle());
        view.getSubtitle().setText(tasks.get(position).getSubtitle());
        view.getCheckbox().setChecked(tasks.get(position).isCompleted());

    }

    @Override
    public int getItemCount() {

        Log.e(LocalDatabase.LOG_TAG, "GetItemCount: " + tasks.size());
        return tasks.size();
    }
}

TaskView.java

package com.austinerck.projectpanda.data;

import android.app.Activity;
import android.content.Intent;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.CheckBox;
import android.widget.TextView;

import com.austinerck.projectpanda.R;
import com.austinerck.projectpanda.activity.ProjectDetailsActivity;
import com.austinerck.projectpanda.activity.ProjectsListActivity;
import com.austinerck.projectpanda.activity.WelcomeActivity;

public class TaskView extends RecyclerView.ViewHolder {

    private View view;
    private TextView title, subtitle;
    private CheckBox checkbox;

    public TaskView(View view) {
        super(view);

        //Gets the different parts of a layout
        this.view = view;
        this.title = (TextView) view.findViewById(R.id.task_title);
        this.subtitle = (TextView) view.findViewById(R.id.task_subtitle);
        this.checkbox = (CheckBox) view.findViewById(R.id.task_checkbox);
    }

    public View getView() {
        return view;
    }

    public TextView getTitle() {
        return title;
    }

    public TextView getSubtitle() {
        return subtitle;
    }

    public CheckBox getCheckbox() {
        return checkbox;
    }
}

activity_project_details.xml

<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/main_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="192dp"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    android:fitsSystemWindows="true">

    <android.support.design.widget.CollapsingToolbarLayout
        android:id="@+id/toolbar_collapsing"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_scrollFlags="scroll|exitUntilCollapsed"
        android:fitsSystemWindows="true"
        app:contentScrim="?attr/colorPrimary"
        app:expandedTitleMarginStart="48dp"
        app:expandedTitleMarginEnd="64dp">

        <ImageView
            android:id="@+id/detail_background"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop"
            android:fitsSystemWindows="true"
            app:layout_collapseMode="parallax"/>

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:layout_collapseMode="pin"/>

    </android.support.design.widget.CollapsingToolbarLayout>

</android.support.design.widget.AppBarLayout>

<android.support.v4.widget.NestedScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="fill_vertical"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <!--<TextView
            android:layout_width="match_parent"
            android:layout_height="@dimen/detail_header_height"
            android:paddingLeft="@dimen/spacing_m"
            android:gravity="center_vertical"
            android:text="@string/details_uncomp"
            android:textSize="@dimen/text_body"
            android:textColor="@color/text_subheader"/>-->

        <android.support.v7.widget.RecyclerView
            android:id="@+id/detail_uncompleted"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

        <!--<TextView
            android:layout_width="match_parent"
            android:layout_height="@dimen/detail_header_height"
            android:paddingLeft="@dimen/spacing_m"
            android:gravity="center_vertical"
            android:text="@string/details_comp"
            android:textSize="@dimen/text_body"
            android:textColor="@color/text_subheader"/>-->

    </LinearLayout>

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

fragment_task.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="@dimen/spacing_xxl"
    android:paddingLeft="@dimen/spacing_m"
    android:paddingRight="@dimen/spacing_m"
    android:gravity="center_vertical">

    <CheckBox
        android:id="@+id/task_checkbox"
        android:layout_width="@dimen/spacing_l"
        android:layout_height="@dimen/spacing_l" />

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="@dimen/spacing_xl">

        <TextView
            android:id="@+id/task_title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Set Austin on fire"
            android:textSize="@dimen/text_subheading"
            android:textColor="@color/text"/>

        <TextView
            android:id="@+id/task_subtitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Light Austin on fire using a Zippo"
            android:textSize="@dimen/text_body"
            android:textColor="@color/text_subheader"/>

    </LinearLayout>

</LinearLayout>

Answer

Jaume Colom Ferrer picture Jaume Colom Ferrer · Oct 8, 2015

Add this property to the NestedScrollView:

android:fillViewport="true"