Recyclerview not displaying items
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);
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, 2022Comments
-
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 over 6 yearsrecyclerview 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 over 6 yearsOkay, But then also try programmatically and remove from XML may be the doing issue sometime in XML.
-
androgirl over 6 yearsIf it only shows 1 item on the screen, shouldn't I at least see the label textview?
-
androgirl over 6 yearsomg that was it. can you explain why that took the entire screen? I thought that the height for the view itself.
-
Sharath kumar over 6 yearsyes 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.