Recyclerview not displaying items

18,973

Solution 1

Keeping height of recycler item as match_parent shows only one view per screen.Change your recycler item height from match_parent to wrap_content.

Also remove app:layout_behavior="@string/appbar_scrolling_view_behavior".

Check this updated code.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
    android:id="@+id/calls_goal_label"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textSize="23sp"
    android:layout_alignParentLeft="true"
    android:layout_margin="20dp"
    android:text="sample"
/>

<TextView
    android:id="@+id/goal_count"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_margin="20dp"
    android:textSize="23sp"
    tools:text="4"/>

Solution 2

You need to specify layout manager before setting an adapter in recyclerview like following

LinearLayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
mRecyclerView.setLayoutManager(mLayoutManager);

or Specify in the layout like following

app:layoutManager="android.support.v7.widget.LinearLayoutManager"

Solution 3

Set android:visibility="visible" in your RecyclerView xml code

Change

<android.support.v7.widget.RecyclerView
    android:id="@+id/goals_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layoutManager="LinearLayoutManager"
    android:divider="@android:color/darker_gray"
    android:dividerHeight="1px"
    android:visibility="gone"
    />

To

<android.support.v7.widget.RecyclerView
    android:id="@+id/goals_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layoutManager="LinearLayoutManager"
    android:divider="@android:color/darker_gray"
    android:dividerHeight="1px"
    android:visibility="visible"
    />

Edit

Add layoutManager to the code .

goalsListView.setLayoutManager(new LinearLayoutManager(this));

And remove app:layoutManager="LinearLayoutManager" in the xml code .

Solution 4

The LayoutManager most interesting part of a RecyclerView. This object tells the RecyclerView when to recycle objects that have transitioned off-screen and where they can go. This was formerly done solely by the ListView. This feature has been separated from the RecyclerView to allow for a variety of layouts: vertical, horizontal, grid, phased, or your own!

LinearLayoutManager arranges objects in a way that resembles a regular ListView.

GridLayoutManager, like a GridView, arranges objects in a grid style.

StaggeredGridLayoutManager arranges items in a staggered grid format.

You can add layoutmanager something like below

Kotlin

var linearLayoutManager = LinearLayoutManager(this)
recycler.layoutManager = linearLayoutManager

Java

    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    recycler.setLayoutManager(linearLayoutManager);
Share:
18,973
androgirl
Author by

androgirl

I have a passion for coding. I love learning anything Android and trying to make it work on my phones. I still consider myself a newbie but I won't be for long. When I am not coding, I am out having fun with my friends or playing with my dog.

Updated on June 13, 2022

Comments

  • androgirl
    androgirl almost 2 years

    Before setting the dataset to the adapter, I am getting the dataset from the Room database, and then I set the data to the adapter and set the adapter to the recyclerview. Currently there are 2 items in the list. From my logs I see that all methods are getting called for the first item in the list but not for the second, and no items or views are being displayed onto the screen. I am not sure what is happening can someone help me spot the issue? Thanks in advance for your help.

    goals_content.xml

     <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        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:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#ffffff"
        android:clickable="true"
        android:orientation="vertical">
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/goals_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layoutManager="LinearLayoutManager"
            android:divider="@android:color/darker_gray"
            android:dividerHeight="1px"
            android:visibility="gone"
            />
    
        <!--view to show if the dataset is empty-->
        <TextView
            android:id="@+id/emptyElement"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:visibility="visible"
            android:text="No Goals Added"
            android:textColor="#525252"
            android:textSize="19sp"/>
    </LinearLayout>
    

    GoalsActivity.java

    GoalsRecyclerViewAdapter adapter;
    RecyclerView goalsListView;
    ....
    
    goalsListView = (RecyclerView) findViewById(R.id.goals_list);
    
    ....
    
    private void createGoalsList() {
    
            new AsyncTask<Void, Void, List<Goal>>(){
    
                @Override
                protected List<Goal> doInBackground(Void... params) {
                    List<Goal> returnedGoals = goalDao.getAllGoals();
                    return returnedGoals;
                }
    
                @Override
                protected void onPostExecute(List<Goal> returnedGoals) {
    
                    //check your goals list is empty or not
                    if(returnedGoals.size() > 0){
    
                        //make the goals list visible if there is data
                        goalsListView.setVisibility(View.VISIBLE);
                        noGoalsTxt.setVisibility(View.GONE);
    
                        //set array adapter for the goals list
                        adapter = new GoalsRecyclerViewAdapter(returnedGoals);
                        goalsListView.setAdapter(adapter);
                    }else{
    
                        //if there is no data display empty list text.
                        goalsListView.setVisibility(View.GONE);
                        noGoalsTxt.setVisibility(View.VISIBLE);
                    }
                }
            }.execute();
        }
    

    GoalsRecyclerviewAdapter.java

    public class GoalsRecyclerViewAdapter extends RecyclerView.Adapter<GoalsRecyclerViewAdapter.GoalsViewHolder> {
    
        private static final String TAG = GoalsRecyclerViewAdapter.class.getSimpleName();
    
        private List<Goal> mGoals;
    
        public GoalsRecyclerViewAdapter(List<Goal> goals) {
            Log.d(TAG, "adapter initialized");
            mGoals = goals;
        }
    
        @Override
        public GoalsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    
            Log.d(TAG, "onCreateViewHolder: inside");
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.goal_row, parent, false);
            return new GoalsViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder(GoalsViewHolder holder, int position) {
    
            Log.d(TAG, "onBindViewHolder: position " + position);
            holder.bind(mGoals.get(position));
        }
    
        @Override
        public int getItemCount() {
            Log.d(TAG, "getItemCount: " + mGoals.size());
            return mGoals.size();
        }
    
        class GoalsViewHolder extends RecyclerView.ViewHolder {
    
            TextView goalsLabel, goalCount;
    
            GoalsViewHolder(View itemView) {
                super(itemView);
                goalsLabel = (TextView) itemView.findViewById(R.id.calls_goal_label);
                goalCount = (TextView) itemView.findViewById(R.id.goal_count);
            }
    
            void bind(Goal goal){
                Log.d(TAG, "bind: " + goal.toString());
                goalsLabel.setText(goal.getGoalTitle());
                goalCount.setText(String.valueOf(goal.getGoalTarget()));
            }
        }
    
        public List<Goal> getGoals(){
            return mGoals;
        }
    
        public void setGoals(List<Goal> goals){
            mGoals = goals;
        }
    }
    

    UPDATED: added row layout goal_row.xml

     <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout 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:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context="com.ubcma.leadster.activity.GoalsActivity"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
    
        <TextView
            android:id="@+id/calls_goal_label"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="23sp"
            android:layout_alignParentLeft="true"
            android:layout_margin="@dimen/text_margin"
            tools:text="@string/calls_per_week"/>
    
        <TextView
            android:id="@+id/goal_count"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_margin="@dimen/text_margin"
            android:textSize="23sp"
            tools:text="4"/>
    
    </RelativeLayout>
    

    logs

    09-27 23:10:08.071 1606-1818/? D/ActivityManager: resumeTopActivityInnerLocked() : #1 prevTask=TaskRecord{46a33bdd0 #6227 A=com.ubcma.leadster U=0 StackId=1 sz=2} next=ActivityRecord{8396555d0 u0 com.ubcma.leadster/.activity.GoalsActivity t6227} mFocusedStack=ActivityStack{43432a4d0 stackId=1, 38 tasks}
    09-27 23:10:08.128 24667-24667/com.ubcma.leadster D/ViewRootImpl@14dce6f[GoalsActivity]: setView = DecorView@be0e77c[GoalsActivity] touchMode=true
    09-27 23:10:08.211 1606-4253/? D/WindowManager: finishDrawingWindow: Window{94ca436d0 u0 com.ubcma.leadster/com.ubcma.leadster.activity.GoalsActivity} mDrawState=DRAW_PENDING
    09-27 23:10:08.213 24667-24667/com.ubcma.leadster D/GoalsRecyclerViewAdapter: adapter initialized
    09-27 23:10:08.214 24667-24667/com.ubcma.leadster D/ViewRootImpl@14dce6f[GoalsActivity]: MSG_RESIZED_REPORT: ci=Rect(0, 72 - 0, 0) vi=Rect(0, 72 - 0, 0) or=1
    09-27 23:10:08.214 24667-24667/com.ubcma.leadster D/ViewRootImpl@14dce6f[GoalsActivity]: MSG_WINDOW_FOCUS_CHANGED 1
    09-27 23:10:08.225 1606-1917/? I/ActivityManager: Displayed com.ubcma.leadster/.activity.GoalsActivity: +153ms
    09-27 23:10:08.229 24667-24667/com.ubcma.leadster D/GoalsRecyclerViewAdapter: getItemCount: 2
    09-27 23:10:08.229 24667-24667/com.ubcma.leadster D/GoalsRecyclerViewAdapter: getItemCount: 2
    09-27 23:10:08.230 24667-24667/com.ubcma.leadster D/GoalsRecyclerViewAdapter: getItemCount: 2
    09-27 23:10:08.230 24667-24667/com.ubcma.leadster D/GoalsRecyclerViewAdapter: onCreateViewHolder: inside
    09-27 23:10:08.233 24667-24667/com.ubcma.leadster D/GoalsRecyclerViewAdapter: onBindViewHolder: position 0
    09-27 23:10:08.234 24667-24667/com.ubcma.leadster D/GoalsRecyclerViewAdapter: bind: Goal{id=1, goalType='r', goalTitle='Recruit', goalFrequency='Month', goalTarget=12}
    09-27 23:10:08.247 1606-12625/? D/WindowManager: finishDrawingWindow: Window{94ca436d0 u0 com.ubcma.leadster/com.ubcma.leadster.activity.GoalsActivity} mDrawState=HAS_DRAWN
    
  • androgirl
    androgirl over 6 years
    recyclerview will be set to visible if there is data in the list, if there is no data the text view will be displayed.
  • Dhaval Solanki
    Dhaval Solanki over 6 years
    Okay, But then also try programmatically and remove from XML may be the doing issue sometime in XML.
  • androgirl
    androgirl over 6 years
    If it only shows 1 item on the screen, shouldn't I at least see the label textview?
  • androgirl
    androgirl over 6 years
    omg that was it. can you explain why that took the entire screen? I thought that the height for the view itself.
  • Sharath kumar
    Sharath kumar over 6 years
    yes the height of the view itself was causing problembeacuse you had given it as match_parent which results in each item of recycler view taking full screen...Also app:layout_behavior="@string/appbar_scrolling_view_behavior" this was unnecessary code.