5

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>
Austin E
  • 651
  • 1
  • 8
  • 17
  • RecyclerView with wrap_content is asking for a trouble. Try replacing it with actual value, let's say 300dp for testing and see if it works out – poss Oct 08 '15 at 17:20
  • Wow! Thanks @poss that fixed it, however how should I do it so that it scales to the correct height? Thank you again! – Austin E Oct 08 '15 at 20:56
  • _how should I do it so that it scales to the correct height?_ not really sure what you mean by that, sorry. If you have 20 things in recyclerview, you dont have to set the height to 20*item_height. You'll just scroll the list of items in it. – poss Oct 08 '15 at 21:04
  • Well I was trying to avoid having a scroll bar since I will have a divider and another recycler under it. – Austin E Oct 08 '15 at 21:06
  • Also, Both recycler views are working now and the correct height. Another issue occurred. The nested scroll view is no longer scrolling, including scrolling the appbar up. – Austin E Oct 08 '15 at 21:18
  • NestedScrollView is not intended to content another scrolling items. Assuming your layout looks like this http://imgur.com/BRUmPIT it would be also useless? Here is link to previous discussion however : http://stackoverflow.com/questions/31000081/how-to-use-recyclerview-inside-nestedscrollview – poss Oct 08 '15 at 21:30
  • That is exactly what I'm trying to do. So how should I handle it? I can't remove the NestedScrollView as it is necessary for the CollapsingToolbarLayout to collapse properly. The other thread was helpful but I don't think I can use their code as he only has one RecyclerView – Austin E Oct 08 '15 at 22:03
  • Yes, but *why* do you need nestedScroll on screen like that? It's not necessary at all. – poss Oct 08 '15 at 22:06
  • Well I'm open to removing it, but the CollapsingToolbarLayout does not collapse if there is not a NestedScrollView. If I remove it and put just a TextView or A LinearLayout with a TextView in it is displayed at the top of the screen and the Toolbar won't collapse. I have only been able to get the toolbar to collapse if I used a NestedScrollView. Again, I'm open removing it, but I have not found something else to fix the CollapsingToolbar. – Austin E Oct 08 '15 at 22:13
  • I expressed myself wrong. What I meant : this layout does not need collapsing toolbar from what i can tell. http://imgur.com/HeodXfC the pinkish part (the screen container) does not need to scroll at all. Both 2 recyclerViews in blue have their own scrolling in bounds. Why would toolbar needed to collapse at all? – poss Oct 08 '15 at 22:26
  • I'm sorry my app looks different, but it has the same basic idea. Here is what it should look like when it is done. http://imgur.com/a/ddrdx – Austin E Oct 08 '15 at 22:36
  • I see. In that case consider using only one recyclerView with multiple `Viewtype` (one viewtype for uncompleted header, second for uncompleted list, third for completed header, fourth for completed list). For implementation specifics look here : http://stackoverflow.com/questions/25914003/recyclerview-and-handling-different-type-of-row-inflation . Second option could be the one we mentioned earlier. During runtime - in your code(!) set up recyclerView height to be `number_of_items*item_height` and disable scrolling on it. That should allow nestedScrollview to handle scroll inputs – poss Oct 08 '15 at 23:02
  • I have it all setup. The only issue I have left is that I can only collapse the toolbar when scrolling on any object other than the recycler. It is hard to explain so here is a video. Thank you so much for all the help you have provided. https://drive.google.com/file/d/0B3N7AhN3y0i0MlhQRXgyMjlOcVU/view?usp=sharing – Austin E Oct 09 '15 at 00:26

3 Answers3

17

Add this property to the NestedScrollView:

android:fillViewport="true"
Jaume Colom Ferrer
  • 419
  • 1
  • 4
  • 14
5

First, add the fillViewport property to your NestedScrollView:

<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"
    android:fillViewport="true">

In addition, you have to use the setAutoMesureEnabled method in the LayoutManager of the RecyclerView:

LinearLayoutManager linearLayoutManager = new LinearLayoutManager( getActivity() );                     
linearLayoutManager.setOrientation( LinearLayoutManager.VERTICAL );
linearLayoutManager.setAutoMeasureEnabled( true );

The setAutoMeasureEnabled method is available since 23.2 in the support design library.

Rafa0809
  • 1,463
  • 18
  • 23
0

it's supper crazy but it work for me. add one attribute android:padding="16" inside RecycelrView attribute.

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/toppers_recycler_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="@dimen/large_space"
            />